我正在创建一个应用程序,其中用户可以被分配到多个组织,组织可以有多个用户--多对多的关系。
我希望能够这样做:$user->organizations()->get()
以及$organizations->users()->get()
用户
表...组织
表...user_orgs
数据透视/映射/等。表user_orgs
表有一个org_id
字段和一个user_id
字段。
Elecoquent假设并期望organization_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.organization_user”不存在(sql:选择organizations
,organization_user
。user_id
作为pivot_user_id
,organization_user
。organization_id
作为organizations
从organizations
内部加入
我脑子里的两个问题是,一个;如何使用user_orgs
,而不是假设organization_user
,就像我可以重写模型上的tableName
或primarykey
一样?第二:如何指定foreignKey列,使其使用user_orgs.org_id
而不是user_orgsorganization_id
?
但请提出替代方案。
谢谢大家,提前。
您可以通过将透视表作为第二个参数传递给bongstomany()
关系来设置透视表的名称,如下所示:
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/Elecoquent-Relationships#多对多
如前所述,为了确定关系的连接表的表名,Eloquent将按字母顺序连接两个相关的模型名。但是,您可以自由地覆盖此约定。可以通过向belomstomany方法传递第二个参数来实现。