Laravel 迁移外键

Laravel migration foreign keys

我正在尝试在 Laravel 中建立一些关系,我对关系和迁移有点困惑。这是我正在做的一个简单示例:

Users -> has_many -> Cats

所以我的用户迁移文件与猫有这样的关系:

$table->foreign('cats_id')->references('id')->on('cats')

但是当我运行迁移时,我得到:

Error: relation cats does not exist...

我是否需要在用户 table 之前构建猫 table?

我是否还需要指定两者之间的外部关系,或者如果模型包含 "hasMany" 和 "belongsTo" 不会 Laravel 在迁移时自动建立这些关系?

我真的需要迁移吗?

在用户模型上指定关系时,Cat 模型也需要存在。

迁移中

用户

$table->foreign('cats_id')->references('id')->on('cats');

$table->foreign('user_id')->references('id')->on('users');

现在您在数据库级别强制完整性。

迁移

运行 使用 php artisan migrate

的迁移

下一步是为您的模型添加完整性

型号

User.php

public function cats()
{
    return $this->hasMany('Cats');
}

Cat.php

public function user()
{
    return $this->belongsTo('User');
}

您不能引用不存在的 table。与Laravel或Eloquent无关,是(My)SQL的事情。

首先创建父 table users,然后子 table cats 引用第一个:

$table->foreign('user_id')->references('id')->on('users')

这就是 User hasMany Cat 的样子。 cats table 有外键引用 users table,而不是像您尝试的那样相反。

您需要将外键设置为 'many' 所在的 table。

$table->foreign('id')->references('cats_id')->on('Users')

您需要确保

  • Table 'Users' 在您创建 table 猫(或引用的任何其他 table 之前存在)
  • 列 'id' 在您创建外键之前存在。 (或引用的任何其他列)

对我来说一个非常可靠的解决方案是使用第一次迁移设置 tables 例如

    public function up()
{
    Schema::create('users', function(Blueprint $table)
    {

        $table->increments('id');
        $table->timestamps();
        $table->string('cats_id');

    });


    //and 


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

        $table->increments('id');
        $table->timestamps();
        $table->string('cat_name');

    });
}

在一个迁移文件中,然后我创建另一个迁移文件,该文件最后运行并为之前 运行 的所有迁移创建所有外键:

public function up()
    {
        Schema::table('cats', function(Blueprint $table)
        {
            $table->foreign('id')->references('cats_id')->on('users');
        });
    }

您还可以通过添加例如

选择在更新或删除用户时您的猫 table 会发生什么
->onUpdate('CASCADE')->onDelete('CASCADE');

$table->...

您必须 运行 迁移猫 table 并创建 table,然后才能将其与用户关联 table。

当您需要进行级联删除或更新时,外键关系将很有帮助。此外,设置猫关系后,像下面这样的插入对您来说会更容易。

$user = User::find(1);

$cats = array(
    new Cat(array('name' => 'Kitty')),
    new Cat(array('name' => 'Lily')),
);

$user->cats()->save($cats);