我知道您可以使用$this->belongs_to()
,$this->has_many()
等相当容易地定义表关系,但我不明白的是如何创建关系表;将两个表绑定在一起的表(我忘记了这个术语的名称)。
假设我正在创建一个用户表。我希望该用户属于某个“角色”。有多个角色,每个角色可以有多个用户。我还需要为此创建一个roles
表。到目前为止,非常好。
但在阅读完文档之后,它说我应该在模型中添加$this->belongs_to()
,而不是迁移本身。何时以及如何创建关系表?如果我创建roles
和users
表,并将$this->belongs_to('roles')
添加到users
模型,将$this->has_many('users')
添加到roles
模型,中间表是自动创建的吗?
答案 0 :(得分:44)
创建迁移时,您可以在表上指定外键, 即。
public function up()
{
Schema::table('roles', function(Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
//rest of fields then...
$table->foreign('user_id')->references('id')->on('users');
});
}
这将在roles表的user_id列上创建一个外键。 外键的好处是,当进行更新或删除时,外键表将自动更新或“级联”,找到了很好的描述here
如Laravel文档中所述,您还可以使用以下语法
指定更新时的级联$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
我会尝试更好地解释它而不是文档,所以请仔细阅读Eloquent ORM文档的"Relationships"部分,看看它是如何完成的。
答案 1 :(得分:15)
看起来似乎从未回答过一些初始问题,即“何时以及如何创建关系表”& “将自动创建中间表”:
据我所知,这些表需要手动创建。因此,像这样创建迁移文件:
Laravel 5
php artisan make:migration create_role_user_table
Laravel 4
php artisan migrate:make create_role_user_table
请注意,名称是单数,并按字母顺序显示。
然后在迁移中,例如:
public function up()
{
Schema::create('role_user', function($table) {
$table->increments('id');
$table->integer('role_id');
$table->integer('user_id');
$table->timestamps();
});
}
希望有所帮助。我不确定数据透视表中是否需要时间戳,所以请试验。
答案 2 :(得分:10)
虽然它是一个旧帖子,但我可以提供更新的内容。对于Laravel5, Jeffrey Way 开发了一个包 Laravel5 Generators-extended ,它增强了php artisan
的生成器功能
make:migration:schema
make:migration:pivot
make:seed
对于用户和角色之间的多对多关系,您只需使用
即可php artisan make:migration:pivot users role
它将生成所需的迁移类。您不需要手动编码。
答案 3 :(得分:1)
据我所知,不会创建任何关系表。您需要做的是在role_id
表上有users
,这样当您创建用户时,角色的ID将存储在那里。这样您就可以选择role_id == '1'
或其中任何可能的用户。
例如:
$admins = User::where('role_id', '=', 1);
ROLES
表上ID='1'
的记录是admin。
因此,再次回答您的问题,不会创建任何关系表,而是在每个用户的role_id
列形式的两个表中存在关系。出于兴趣,你使用外键吗?
如果你想拥有一个关系表,你可以创建一个名为user_roles
的东西,然后将role_id
和user_id
存储在那里,但我认为更容易使用上述方法那时你可以使用所有的Laravel / Eloquent善良。
希望这会有所帮助:)
答案 4 :(得分:0)
这段视频帮助了我。
https://laracasts.com/series/laravel-5-fundamentals/episodes/14
令我惊讶的是,只有关系的一方需要在迁移表中使用pointer_id,而不是两者。例如,如果我们有许多文章的作者,我们只添加
DataRow
文章迁移,就是这样。
答案 5 :(得分:0)
我知道这是一个老帖子,但我心里也有同样的问题。我在Laravel manual (5.0)中找到了解决方案,其中描述了对于这种特定的多对多关系,您可以手动创建表,然后以这种方式将关系类型声明为模型:
return $this -> belongsToMany('App\<Model>', '<table_created_manually>');
或者如果您想使用特定的关联键:
return $this -> belongsToMany('App\<Model>', '<rel_table1_table2>' '<table1>_id', '<table2>_id');
希望这可以提供帮助。