Laravel 外国限制的问题-

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

我试图遵循laravel和laracasts的文档,但是我在迁移外键时遇到了一个错误

我有一些关于游戏的文章是由作者(用户)写的,所以我想要这篇文章的用户Id。 这是我的游戏桌:

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
games
add 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
字段,这是目前的实际错误,一旦修复,这将是您在此处描述的问题