我正试图在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是否会在迁移时自动构建这些关系?
我真的需要迁移吗?
答案 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')
您需要确保
对我来说,一个非常灵活的解决方案是使用第一次迁移设置表格,例如
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');
}