startup-palace/laravel-helpers

为您的Laravel应用程序收集了一系列辅助函数。

dev-master 2019-07-05 15:53 UTC

README

此包已被弃用,建议使用 kblais/laravel-helpers

Laravel-helpers 是一个用于您的Laravel应用程序的辅助函数集合。

安装

使用Composer要求此包

composer require startup-palace/laravel-helpers

辅助函数列表

SingularTableNameTrait

使用单数表名而不是默认的复数表名。

用法

将特性添加到您的模型中

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use StartupPalace\LaravelHelpers\Eloquent\SingularTableNameTrait;

class User extends Model
{
    use SingularTableNameTrait;
}

OrderByDefaultOrderTraitOrderByDefaultOrderInterface

这是一个全局范围,可以在您的Eloquent模型上应用默认排序,以及一个特性,您可以直接在模型属性中定义默认排序。

用法

namespace App;

use Illuminate\Database\Eloquent\Model;
use StartupPalace\LaravelHelpers\Eloquent\OrderByDefaultOrderTrait;
use StartupPalace\LaravelHelpers\Eloquent\OrderByDefaultOrderInterface;

class User extends Model implements OrderByDefaultOrderInterface
{
    use OrderByDefaultOrderTrait;

    public function getDefaultOrder()
    {
        /**
         * Defaults to
         * column: self::CREATED_AT
         * asc: true
         */
        return [
            'column' => 'last_login_at',
            'asc' => 'desc',
        ];
    }
}

关系辅助函数

为您的Eloquent关系提供一系列辅助函数。

syncHasManyRelation

同步hasMany关系,删除旧项,更新现有项和创建新项。

用法

让我们从这个模型开始

namespace App;

use App\Cat;
use Illuminate\Database\Eloquent\Model;
use StartupPalace\LaravelHelpers\Eloquent\RelationshipHelpersTrait;

class User extends Model
{
    use RelationshipHelpersTrait;

    protected $fillable = [
        'name', 'email', 'cats',
    ];

    protected static function boot()
    {
        parent::boot();

        self::saved(function ($user) {
            $user->syncHasManyRelation('cats');
        });
    }

    public function cats()
    {
        return $this->hasMany(Cat::class);
    }

    public function setCatsAttribute($cats)
    {
        $this->setHasManyItems('cats', $cats);
    }
}

基于此,您可以直接像这样将猫添加到用户中

$user->create([
    'name' => 'John Doe',
    'email' => 'john.doe@example.com',
    'cats' => [
        [
            'name' => 'Garfield',
            'color' => 'orange',
        ],
        [
            'number' => 'Fuzzy',
            'color' => 'yellow',
        ],
    ],
]);

当您更新模型时,如果传递一个 cats 键,则如果没有,猫将被自动创建、更新或删除。

syncHasOneRelation

同步hasOne关系,创建新的关系项或更新它。

用法
namespace App;

use App\Cat;
use Illuminate\Database\Eloquent\Model;
use StartupPalace\LaravelHelpers\Eloquent\RelationshipHelpersTrait;

class User extends Model
{
    use RelationshipHelpersTrait;

    protected $fillable = [
        'name', 'email', 'address',
    ];

    protected static function boot()
    {
        parent::boot();

        self::saved(function ($user) {
            $user->syncHasOneRelation('address');
        });
    }

    public function address()
    {
        return $this->hasOne(Address::class);
    }

    public function setAddressAttribute($address)
    {
        $this->setHasOneItem('address', $address);
    }
}

要创建带有地址的用户,只需以下内容

$user->create([
    'name' => 'John Doe',
    'email' => 'john.doe@example.com',
    'address' = [
        'number' => '18',
        'street' => 'rue Scribe',
        'city' => 'Nantes',
        'country' => 'France',
    ],
]);

update() 方法中传递一个 address 数组也将更新用户的地址。

Routing\Middleware\AreRelated

AreRelated 中间件允许您检查两个路由资源是否相关。它目前仅与 HasOneOrMany/BelongsTo 关系一起工作。

用法

在您的 app/Http/Kernel.php 中,在 $routeMiddleware 数组中添加以下行

'areRelated' => \StartupPalace\LaravelHelpers\Routing\Middleware\AreRelated::class,

然后,让我们假设我们有两个模型 ChannelMessage

use \Illuminate\Database\Model;

class Channel extends Model
{
    //
}

class Message extends Model
{
    public function channel()
    {
        return $this->belongsTo(Channel::class);
    }
}

然后,在您的路由中

Route::resource('channel.message', 'MessageController');

因为您的资源和您的关联具有相同的名称(channelmessage),您可以将中间件添加到您的资源路由中,以确保您尝试访问的消息属于其频道。

Route::resource('channel.message', 'MessageController')
    ->middleware('areRelated:channel,message');