Laravel Eloquent与多个中间表的多对多关系

时间:2018-04-25 05:42:38

标签: laravel laravel-5 eloquent

我正在使用Laravel 5.4并且具有如下的模型和表结构:

users
-----
id

accounts
--------
id

holdings
--------
id
account_id (foreign key to account)

user_accounts
-------------
id
user_id
account_id
  • 用户可以拥有多个帐户
  • 帐户可由多个用户共享
  • 每个帐户都有多个馆藏
  • 因此,用户通过其众多帐户间接拥有多个馆藏。

我需要帮助在用户模型上定义一个名为“馆藏”的关系,以获取适用于用户的所有馆藏(基于他们所链接的帐户)。

我尝试了很多不同的东西,并在谷歌上花了很多年。我可以接近belongsToMany和hasManyThrough,但它们似乎只适用于3个表关系,其中中间表存储来自其他表的主键。如果我使用馆藏表上的account_id外键来删除通过帐户表加入的需要,我可以将我的关系减少到3个表(而不是4个),但是我似乎无法使其工作。

belongsToMany - holdingsid需要holdingsaccount_id

select * from `holdings`
inner join `user_accounts` on `holdings`.`id` = `user_accounts`.`account_id`
where `user_accounts`.`user_id` = ?

hasManyThrough - user_accountsid必须为user_accountsaccount_id

select * from `holdings`
inner join `user_accounts` on `user_accounts`.`id` = `holdings`.`account_id`
where `user_accounts`.`user_id` = ?"

1 个答案:

答案 0 :(得分:1)

当我询问laravel 5.4时,它并不是一个严格的答案,但这是一个可能的解决方案。

事实证明我很幸运,因为我遇到了这个Laravel belongsToMany relationship defining local key on both tables,这表明在Laravel 5.5中已经增强了belongsToMany关系以支持这种类型的场景。

我已将项目升级到L5.5并用以下关系替换了我的黑客:

return $this->belongsToMany(Holding::class, 'user_accounts', 'user_id', 'account_id', null, 'account_id');

我很高兴地说它似乎完美无缺 - 至少对于基本的获取是我的用例,我没有尝试任何更新等。

感谢@cyberfly和那些发布上述答案的人