Красноречиво, используйте pluck (), чтобы отфильтровать глубокую коллекцию - PullRequest
0 голосов
/ 26 апреля 2020

Мне нужно вернуть массив только с разрешениями name, но я не могу заставить его работать с ->pluck()

class User
{
public function roleTeams()
    {
        return $this->hasMany(RoleTeam::class);
    }
}
class RoleTeams
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}
class Role
{
    public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }
}

Это последний код, который я пытаюсь использовать на аналогичные ответы я нашел.

$permissions = $user->roleTeams()->with('roles.permissions')->pluck('roles.*.permissions.*.name')->all();

Ожидаемый результат

[
    'edit_user',
    'delete_user',
    ...
]

1 Ответ

1 голос
/ 26 апреля 2020

Итак, я попытался смоделировать вашу ситуацию. Мой код:

$arr = [
    'id'    => 1,
    'name'  => 'User 1',
    'roles' => [
        [
            'id'          => 2,
            'name'        => 'Admin',
            'permissions' => [
                [
                    'id'   => 8,
                    'name' => 'edit_user',
                    'type' => 'editor',
                ],
                [
                    'id'   => 9,
                    'name' => 'delete_user',
                    'type' => 'deleter',
                ],
            ],
        ],
        [
            'id'          => 3,
            'name'        => 'Manager',
            'permissions' => [
                [
                    'id'   => 6,
                    'name' => 'do_smth1_with_user',
                    'type' => 'smth1',
                ],
                [
                    'id'   => 7,
                    'name' => 'do_smth2_with_user',
                    'type' => 'smth2',
                ],
            ],
        ],
    ],
];

$collection = collect([$arr]);

И есть интересные результаты. Если использовать метод pluck(), как в вашем ответе:

dd($collection->pluck('roles.*.permissions.*.name'));

Результат будет таким:

Collection {#322 ▼
  #items: array:1 [▼
    0 => array:4 [▼
      0 => "edit_user"
      1 => "delete_user"
      2 => "do_smth1_with_user"
      3 => "do_smth2_with_user"
    ]
  ]
}

Но если я использую pluck() с методом collapse(), он выглядит как вы хотите:

dd($collection->pluck('roles')->collapse()->pluck('permissions')->collapse()->pluck('name'));

И результат:

Collection {#322 ▼
  #items: array:4 [▼
    0 => "edit_user"
    1 => "delete_user"
    2 => "do_smth1_with_user"
    3 => "do_smth2_with_user"
  ]
}

Если честно, я не знаю, почему он работает так, как работает, но попробуйте использовать его с collapse() метод и дайте мне знать, если это поможет вам или нет. Надеюсь, мой ответ поможет вам решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...