雄辩的多对多对多 - 如何轻松加载远距离关系

Posted

技术标签:

【中文标题】雄辩的多对多对多 - 如何轻松加载远距离关系【英文标题】:Eloquent many-to-many-to-many - how to load distant relation easily 【发布时间】:2014-11-28 23:45:27 【问题描述】:

我有 3 张桌子;用户、组和权限

在模型中,我将关系设置为 belongsToMany 在用户模型中:

public function groups() 
    return $this->belongsToMany('Group');

在组模型中:

public function users() 
    return $this->belongsToMany('User');


public function permissions() 
    return $this->belongsToMany('Permission');

在权限模型中:

public function groups() 
    return $this->belongsToMany('Group', 'id');

许多用户 - 到 - 许多组 多组对多权限

我正在尝试获取用户拥有的所有权限,但不知道它的代码应该是什么样子。有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

你可以这样做:

User::where('id', $id)->with(['groups.permissions' => function ($q) use (&$permissions) 
     $permissions = $q->get()->unique();
])->first();

// then
$permissions; // collection of unique permissions of the user with id = $id

【讨论】:

仍然不知道如何,但它确实有效。需要深入阅读文档。 超级聪明的朋友 @PawelBieszczad 你不会在文档中找到它。这只是获得所需内容的技巧。缺点是它将运行 1 个额外的查询来获取它,但它比循环遍历相关集合要容易得多,它甚至适用于更深的嵌套关系。 我有一个类似的问题,但我有点卡住了,你能帮我一下吗,Jarek? ***.com/questions/29662699/laravel-eloquent-nesting @dbr 这应该是softonsofa.com/…【参考方案2】:

如果您急于加载,它应该看起来像这样......

$user = User::where('id', $id)->with(['groups.permissions'])->first();

【讨论】:

我将如何获得权限? $q = User::where('id', $id)->with(['groups.permissions'])->first(); dd($q->权限);没有显示任何东西 $q->groups[$index]->permissions 我试图避免循环,例如获取数组或集合中所有权限的查询

以上是关于雄辩的多对多对多 - 如何轻松加载远距离关系的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的多对多关系总是空的

Laravel 5 雄辩的多对多关系问题

在 TypeORM 与 GraphQL 的多对多关系上使用数据加载器,查询多对多

Laravel 雄辩的多对多模型

如何在休眠/弹簧中更新多对多集合(延迟加载)?

hibernate 的 关联关系之多对多 和 延迟加载