Php 雄辩的uuid作为外键
我正在尝试将UUID用作数据库中的外键。我希望Admin表引用User表 数据库是PostgreSQL,但无论如何都应该可以工作 用户表:Php 雄辩的uuid作为外键,php,laravel,postgresql,foreign-keys,uuid,Php,Laravel,Postgresql,Foreign Keys,Uuid,我正在尝试将UUID用作数据库中的外键。我希望Admin表引用User表 数据库是PostgreSQL,但无论如何都应该可以工作 用户表: Schema::create('users', function (Blueprint $table) { $table->uuid('id')->primary(); $table->string('name', 80); $table->string('email', 80)
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');
...
});
我还尝试将外键指定为字符串,因为我的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]
及
我该怎么做?
关于这一点,我找到的最接近的帖子是:
但不知怎么的,它不起作用
顺便说一句,我用的是Laravel 8
谢谢您的帮助。请尝试以下方法:
Schema::create('administrators', function (Blueprint $table) {
...
$table->string('fk_user_id');
...
});
```
您是否使用了trait
usesuid
的插件?我使用了这个包,但是使用了mysql
,没有任何问题。我不仅用于模式生成,还用于种子机。该包在@JitendraYadav下运行得非常好。谢谢应该从一开始就使用它。只是为了确保,请检查postgres中的uuid
的数据类型。string(36)
和uuid
都应该具有精确的数据类型错误是一列是uuid类型,另一列是varchar类型。不同的类型不能相互引用,谢谢@Martin的回复。我确实试过了。有或没有36个字符的限制。不过,我的问题已经由吉坦德拉·亚达夫解决了。无论如何,谢谢你。
Schema::create('administrators', function (Blueprint $table) {
...
$table->string('fk_user_id');
...
});
```