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

时间:2019-08-10 23:14:15

标签: php mysql laravel eloquent relationship

我正在创建一个应用程序,其中可以将用户分配给多个组织,并且组织可以具有许多用户-多对多关系。

我希望能够执行以下操作: $user->organisations()->get()$organisation->users()->get()

  • 我有一个users表...
  • 我有一个organisations表...
  • 嗯!用户组织,组织用户!
  • ,我有一个user_orgs数据透视/映射/等。桌子

注意

user_orgs表具有一个org_id字段和一个user_id字段。

雄辩地假定并期望organisation_user-但这不是我为表命名的名称,也不是我想重命名的名称。

我设置了以下

App / Organisation.php

public function users(){
    return $this->belongsToMany("App\User");
}

和用户:

App / User.php

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_useruser_idpivot_user_idorganisation_userorganisation_id作为{{1}的pivot_organisation_id,来自organisations上的organisation_user内部联接organisationsid = { {1}}。organisation_user,其中organisation_idorganisation_user = 1)

我想到的两个问题是:如何指定Eloquent使用user_id而不是假设user_orgs,就像我可以在模型上覆盖organisation_usertableName一样?第二:如何指定ForeignKey列,使其使用primaryKey而不使用user_orgs.org_id

但是请建议其他方法。

先谢谢大家。

1 个答案:

答案 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方法来实现。