Laravel 4 - 链接多对多关系

时间:2014-03-17 20:59:39

标签: php laravel laravel-4 eloquent

我有这些表格:

| users       |
|-------------|
| id          |
| name        |

| groups      |
|-------------|
| id          |
| name        |

| permissions |
|-------------|
| id          |
| name        |
| perm_key    | <- UNIQUE index

然后我有这些多对多的关系:

groups -> groups_users <- users
groups -> groups_permissions <- permissions

因此,任何用户都可能属于多个组,每个组可能拥有一组权限。

现在,我尝试使用给定的权限密钥获取DISTINCT用户的集合,或者换句话说,包含所有可访问&#39;的所有用户的集合。 accessSpecialPlace&#39;权限。

到目前为止我得到了什么:

$key = 'accessSpecialPlace';
$permission = Permission::with('groups', 'groups.users')->where('permKey', '=', $key)->first();
$resultUsers = array();
foreach($permission->groups as $group) {
        foreach($group->users as $user) {
            $resultUsers[] = array(
                'id' => $user->id,
                'first_name' => $user->first_name
            );
        }
    }
return Response::json($resultUsers, 200, array(), JSON_PRETTY_PRINT);

到目前为止,这是完美无缺的,除了它还不是一个集合(我只是将它们添加到数组中)并且它还没有区别(因为如果用户属于2个可以访问该权限的组,它们将出现两次)。

PS:在我的第一次尝试中,我没有期望让急切的装载部件如此轻松地工作!我喜欢这个框架!

1 个答案:

答案 0 :(得分:1)

创建一个集合而不是一个数组,并使用put存储用其ID标识的用户:

$permission = Permission::with('groups.users')->where('permKey', $key)->first();

$users = new Illuminate\Support\Collection;

foreach ($permission->groups as $group)
{
    foreach ($group->users as $user)
    {
        $users->put($user->id, $user);
    }
}

如果希望集合包含数组而不是模型,请将数组作为第二个参数传递给put


P.S。此处使用hasManyThrough关系可以简化操作。