Eloquent多对多对多——如何轻松加载远程关系

4

我有三个表:用户、组和权限

在数据模型中,我将它们的关系设置为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');
}

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

我试图获取用户拥有的所有权限,但不知道代码应该如何编写。是否有人可以帮忙?

2个回答

13

这是你可以完成它的方法:

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

还不知道怎么做,但它确实可以工作。需要更深入地阅读文档。 - Pawel Bieszczad
1
超聪明的我的朋友 - lagbox
@PawelBieszczad 在文档中找不到这个。这只是一个获取所需内容的技巧。缺点是它会运行额外的查询来获取它,但比循环遍历相关集合要简单得多,而且即使在更深层次的嵌套关系中也能正常工作。 - Jarek Tkaczyk
我有一个类似的问题,但是我卡住了,你能帮我一下吗,Jarek? http://stackoverflow.com/questions/29662699/laravel-eloquent-nesting - Marko Mijailovic
@JarekTkaczyk,你能否提供一些关于这里正在发生什么的信息? - dbr
1
@dbr 这个应该可以做到 http://softonsofa.com/laravel-querying-any-level-far-relations-with-simple-trick/ - Jarek Tkaczyk

0
如果你正在使用 eager loading,它应该看起来像这样...
$user = User::where('id', $id)->with(['groups.permissions'])->first();

我该如何获取权限?$q = User::where('id', $id)->with(['groups.permissions'])->first();dd($q->permission);没有显示任何内容。 - Pawel Bieszczad
$q->groups[$index]->permissions - Rob
我试图避免循环,比如查询以获取数组或集合中的所有权限。 - Pawel Bieszczad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接