Laravel迁移外键

时间:2015-01-09 07:34:04

标签: php laravel laravel-4

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

Users -> has_many -> Cats

所以我的用户迁移文件与Cats有关系,如下所示:

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

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

Error: relation cats does not exist...

我是否需要在Users表之前构建Cats表?

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

我真的需要迁移吗?

4 个答案:

答案 0 :(得分:4)

您无法引用不存在的表。它与Laravel或Eloquent无关,它是(我的)SQL的事情。

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

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

这就是User hasMany Cat的样子。 cats表有外键引用users表,而不像你试过的那样。

答案 1 :(得分:1)

您需要将外键设置为“many”所在的表。

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

您需要确保

  • 表'用户'在您创建表Cats(或任何其他引用的表)之前存在
  • 在创建外键之前存在列'id'。 (或引用的任何其他列)

对我来说,一个非常灵活的解决方案是使用第一次迁移设置表格,例如

    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');
        });
    }

您还可以通过添加例如

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

$table->...

答案 2 :(得分:0)

您必须先运行cats表的迁移并创建该表,然后才能将其与users表关联。

当您需要执行级联删除或更新时,外键关系将非常有用。此外,对于设置了猫的关系,下面的插入将更容易。

$user = User::find(1);

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

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

答案 3 :(得分:-1)

在用户模型上指定关系时,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');
}