猿问

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

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

我希望能够做这样的事情: $user->organisations()->get()以及$organisation->users()->get()

  • 我有一张users桌子...

  • 我有一张organisations桌子...

  • 我有一个user_orgs枢轴/映射/等。桌子

笔记

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


Eloquent 假设并期望organisation_user- 但这不是我为我的表命名的,我也不想重命名。


我设置了以下内容


应用程序/组织.php

public function users(){

    return $this->belongsToMany("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:select organisations.*, organisation_user. user_idas pivot_user_id, organisation_user. organisation_idas pivot_organisation_idfrom internal organisationsjoin organisation_useron organisations. id= organisation_user. organisation_idwhere organisation_user. user_id= 1)


我心中的两个问题是,一;我如何指定 Eloquent 来使用user_orgs而不是假设organisation_user,就像我可以覆盖模型上的tableName或 一样primaryKey?二:如何指定foreignKey 列,使其使用user_orgs.org_id而不是user_orgs.organisation_id?


但请提出替代方案。


谢谢大家,提前。


慕桂英4014372
浏览 155回答 1
1回答

Cats萌萌

您可以通过将其作为第二个参数传递给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 方法传递第二个参数来实现。
随时随地看视频慕课网APP
我要回答