雄辩的Uuid作为外键

问题描述

我正在尝试将Uuids用作数据库中的外键。我希望管理表引用用户表。

数据库是Postgresql,但是无论如何它都可以工作。

用户表:

    Schema::create('users',function (Blueprint $table) {
        $table->uuid('id')->primary();
        $table->string('name',80);
        $table->string('email',80)->unique();

        ...

    });

“我的管理员”表:

    Schema::create('administrators',function (Blueprint $table) {
        $table->increments('id');
        $table->uuid('fk_user_id');
        $table->foreign('fk_user_id')->references('id')->on('users')->onDelete('cascade');

        ...

    });

我还尝试将外键分配为String,因为我的Uuid特性如下:

<?PHP

namespace App\Models\Concerns;

use Illuminate\Support\Str;

trait UsesUuid
{
    protected static function bootUsesUuid()
    {
        static::creating(function ($model) {
            if (! $model->getKey()) {
                $model->{$model->getKeyName()} = (string) Str::uuid();
            }
        });
    }

    public function getIncrementing()
    {
        return false;
    }

    public function getKeyType()
    {
        return 'string';
    }
}

因此我的管理员表如下:

    Schema::create('administrators',function (Blueprint $table) {
        $table->increments('id');
        $table->string('fk_user_id',36);
        $table->foreign('fk_user_id')->references('id')->on('users')->onDelete('cascade');

        ...

    });

我总是会遇到相同的错误

[2020-10-15 10:52:44] local.ERROR: sqlSTATE[42804]: Datatype mismatch: 7 ERROR:  foreign key constraint "administrators_fk_user_id_foreign" cannot be implemented
DETAIL:  Key columns "fk_user_id" and "id" are of incompatible types: character varying and uuid. (sql: alter table "administrators" add constraint "administrators_fk_user_id_foreign" foreign key ("fk_user_id") references "users" ("id") on delete cascade) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 42804): sqlSTATE[42804]: Datatype mismatch: 7 ERROR:  foreign key constraint \"administrators_fk_user_id_foreign\" cannot be implemented
DETAIL:  Key columns \"fk_user_id\" and \"id\" are of incompatible types: character varying and uuid. (sql: alter table \"administrators\" add constraint \"administrators_fk_user_id_foreign\" foreign key (\"fk_user_id\") references \"users\" (\"id\") on delete cascade) at C:\\MyFolder\\Dev\\MyProjects\\Laravel\\VitruvianShield\\vitruvianshield\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.PHP:669)
[stacktrace]

[prevIoUs exception] [object] (PDOException(code: 42804): sqlSTATE[42804]: Datatype mismatch: 7 ERROR:  foreign key constraint \"administrators_fk_user_id_foreign\" cannot be implemented
DETAIL:  Key columns \"fk_user_id\" and \"id\" are of incompatible types: character varying and uuid. at C:\\MyFolder\\Dev\\MyProjects\\Laravel\\VitruvianShield\\vitruvianshield\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.PHP:463)
[stacktrace]

我该怎么做? 我发现的与此最接近的帖子是:

laravel 7 using as uuid foreign key

但是以某种方式不起作用。

我正在使用Laravel 8,顺便说一句。

谢谢您的帮助。

解决方法

在这里尝试:

Schema::create('administrators',function (Blueprint $table) {
        ...

        $table->string('fk_user_id');

        ...

    });
```