提问者:小点点

使用透视表的Laravel多对多关系


我正在创建一个应用程序,其中用户可以被分配到多个组织,组织可以有多个用户--多对多的关系。

我希望能够这样做:$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_useruser_id作为pivot_user_id,organization_userorganization_id作为organizationsorganizations内部加入

我脑子里的两个问题是,一个;如何使用user_orgs,而不是假设organization_user,就像我可以重写模型上的tableNameprimarykey一样?第二:如何指定foreignKey列,使其使用user_orgs.org_id而不是user_orgsorganization_id

但请提出替代方案。

谢谢大家,提前。


共1个答案

匿名用户

您可以通过将透视表作为第二个参数传递给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方法传递第二个参数来实现。