Laravel 外国限制的问题-
我试图遵循laravel和laracasts的文档,但是我在迁移外键时遇到了一个错误 我有一些关于游戏的文章是由作者(用户)写的,所以我想要这篇文章的用户Id。 这是我的游戏桌:Laravel 外国限制的问题-,laravel,foreign-keys,migration,Laravel,Foreign Keys,Migration,我试图遵循laravel和laracasts的文档,但是我在迁移外键时遇到了一个错误 我有一些关于游戏的文章是由作者(用户)写的,所以我想要这篇文章的用户Id。 这是我的游戏桌: public function up() { Schema::create('games', function (Blueprint $table) { $table->id('id'); $table->timestamps(); $table-&g
public function up()
{
Schema::create('games', function (Blueprint $table) {
$table->id('id');
$table->timestamps();
$table->string('name', 100);
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->text('description');
$table->string('publisher');
$table->string('url');
});
}
这是我的用户表:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
如果我理解正确,我将游戏表中的列命名为“user_id”,它引用用户的id,在用户表中称为“id”
但是,当迁移时,我发现错误,没有用户id
SQLSTATE[42000]:语法错误或访问冲突:1072键列“user\u id”在表中不存在(SQL:alter table
gamesadd constraint
games\u user\u id\u foreign外键(
user\u id)引用
users(
id)在删除级联中)
有人能告诉我我做错了什么吗?我是否混淆了应该在用户表中引用“id”的位置?默认情况下,迁移的运行顺序与创建迁移的顺序相同,在您的情况下,
游戏
迁移是在用户
迁移之前执行的,因此在迁移游戏
迁移时,没有用户
表,依此类推
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
将失败
为了解决此问题,请将用户
迁移重命名为游戏
迁移之前的日期
感谢@lagbox指出这一点:这条线不是在创建新字段,而是在添加约束
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
相反,应首先创建字段,然后创建约束:
$table->bigInteger('user_id)->...;
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
我通常的做法是:
- 创建迁移文件(包含所有字段)
- 创建更改文件(添加FK)
phpartisan migrate
时,迁移的顺序不会阻止任何东西
使用上面的代码,您试图在不存在的字段上添加外部约束您以错误的顺序迁移表您试图在不存在的字段上创建外键<代码>游戏没有名为
用户id
的字段。。您必须先创建字段,然后才能将其设置为外键。他们也从未在游戏
上创建用户id
字段,这是目前的实际错误,一旦修复,这将是您在此处描述的问题