【问题标题】:Laravel 4 - Chaining Many-to-Many relationshipsLaravel 4 - 链接多对多关系
【发布时间】:2014-03-17 20:59:38
【问题描述】:

我有这些表:

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

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

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

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

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

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

现在我正在尝试使用给定的权限密钥获取 DISTINCT 用户的集合,或者换句话说,一个包含所有具有访问“accessSpecialPlace”权限的用户的集合。

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

$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:我没想到在我的第一次尝试中就可以轻松加载急切的加载部分!我喜欢这个框架!

【问题讨论】:

  • 除非你真的需要JSON_PRETTY_PRINT,你可以直接返回数组/集合。 Laravel 会自动为你转换成 JSON。
  • 我只是为了测试目的而漂亮地打印 JSON。

标签: php laravel laravel-4 eloquent


【解决方案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 关系可以简化事情。

【讨论】:

  • 我试过 hasManyThrough 但它 Laravel 的 whoops 页面说它在表本身中寻找外键,而不是在数据透视表中。所以,我想这仅适用于一对多关系。
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 2014-04-21
  • 2023-01-13
  • 1970-01-01
  • 2013-09-19
  • 2013-09-05
  • 2013-11-14
  • 2018-06-15
相关资源
最近更新 更多