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);
我正在尝试在 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);