如何在spatie / laravel权限中使用UUID

时间:2018-11-21 09:15:39

标签: php laravel laravel-5 eloquent spatie

我将ramsey/uuid用作所有项目表的主键。如何禁用自动增量并允许rolespermissions主键可填充?我已经设法在其他桌子上做到这一点,但我坚持使用这两张桌子。

1 个答案:

答案 0 :(得分:2)

app中创建一个名为Traits的文件夹。在其中创建文件Uuids.php

将以下代码添加到Uuids.php;

<?php

namespace YourNamespace;

use Illuminate\Support\Str;

trait Uuids
{
    /**
    * Boot function from Laravel
    */
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $model->incrementing = false;
            $model->{$model->getKeyName()} = Str::uuid()->toString();
        });
    }
}

然后在您的迁移文件中,应该有类似以下内容的内容:

$table->uuid('id')->primary();替换$table->increments('id');

别忘了在模型中使用Uuids特性;

<?php

namespace YourNamespace;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    use Uuids;

    protected $guarded = [''];
    protected $casts = [
        'id' => 'string',
    ];
...

在修改列之前,请确保将doctrine/dbal依赖项添加到composer.json文件中。 Doctrine DBAL库用于确定列的当前状态,并创建对列进行指定调整所需的SQL查询:

composer require doctrine/dbal

接下来,您将创建一个迁移文件;

php artisan make:migration change_primary_key_type_in_roles_table --table=roles,然后在您的迁移文件中。您可以这样做,例如。

public function up()
{
    Schema::table('roles', function (Blueprint $table) {
        $table->uuid('id')->change();
    });
}

public function down()
{
    Schema::table('roles', function (Blueprint $table) {
        $table->increments('id')->change();
    });
}

不要忘记做composer dumpautoload

希望这会有所帮助。

更新:我写了一篇有关如何实现此here

的博客文章。