我有这些表格:
| 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:在我的第一次尝试中,我没有期望让急切的装载部件如此轻松地工作!我喜欢这个框架!答案 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
关系可以简化操作。