我正在创建一个应用程序,其中可以将用户分配给多个组织,并且组织可以具有许多用户-多对多关系。
我希望能够执行以下操作:
$user->organisations()->get()
和$organisation->users()->get()
users
表... organisations
表... user_orgs
数据透视/映射/等。桌子 user_orgs
表具有一个org_id
字段和一个user_id
字段。
雄辩地假定并期望organisation_user
-但这不是我为表命名的名称,也不是我想重命名的名称。
我设置了以下
public function users(){
return $this->belongsToMany("App\User");
}
和用户:
public function organisations(){
return $this->belongsToMany("App\Organisation");
}
然后我对此进行测试:
Route::get('/test-route', function(){
$u = App\User::first();
return $u->organisations()->get();
});
并出现以下错误:
SQLSTATE [42S02]:找不到基表或视图:1146表'db.organisation_user'不存在(SQL:选择
organisations
。*,organisation_user
。user_id
为pivot_user_id
,organisation_user
。organisation_id
作为{{1}的pivot_organisation_id
,来自organisations
上的organisation_user
内部联接organisations
。id
= { {1}}。organisation_user
,其中organisation_id
。organisation_user
= 1)
我想到的两个问题是:如何指定Eloquent使用user_id
而不是假设user_orgs
,就像我可以在模型上覆盖organisation_user
或tableName
一样?第二:如何指定ForeignKey列,使其使用primaryKey
而不使用user_orgs.org_id
?
但是请建议其他方法。
先谢谢大家。
答案 0 :(得分:2)
您可以通过将数据透视表的名称作为第二个参数传递给belongsToMany()
关系来设置名称,如下所示:
public function users(){
return $this->belongsToMany("App\User", "user_orgs");
}
public function organisations(){
return $this->belongsToMany("App\Organisation", "user_orgs");
}
文档: https://laravel.com/docs/5.8/eloquent-relationships#many-to-many
如前所述,为了确定关系的联接表的表名,Eloquent将按字母顺序联接两个相关的模型名。但是,您可以随意重写此约定。您可以通过将第二个参数传递给belongsToMany方法来实现。