Доступ к столбцу целевой таблицы после отношения вызова - Laravel - PullRequest
0 голосов
/ 01 мая 2020

У меня есть три таблицы следующим образом

Базовая таблица

users
    id - integer
    name - string

Целевая таблица

roles
    id - integer
    name - string

Сводная таблица

role_user
    user_id - integer
    role_id - integer

Многие для существует множество взаимосвязей между users и roles table

Если я хочу, чтобы все пользователи с role_id равным '1', я мог просто сделать это как

$result = User::whereHas('roles', function ($q){
   $q->where('roles.id', 1);
});

, но я также хотите, чтобы имя роли соответствовало role_id '1', который является name столбцом таблицы roles.

Есть ли способ добавить имя роли в $result collection.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Я думаю, вы можете использовать map(). Стремительная загрузка (with()) очень важна для предотвращения проблемы N + 1 в вашем запросе. Без энергичной загрузки один дополнительный запрос будет выполнен для каждого пользователя в вашем результате.

$result = App\User::query()
    ->with([
        'roles' => function ($q) {
            $q->whereId(1);
        }
    ])
    ->whereHas('roles', function ($q) {
        $q->whereId(1);
    })
    ->get()
    ->map(function ($user) {
        $user['name'] = $user->roles->first()->name;

        return $user;
    });
0 голосов
/ 01 мая 2020

Вы можете Eagerload взаимосвязь, чтобы получить нужный столбец:

User::whereHas('roles', function ($q){
            $q->where('roles.id', 1);
        })->with(['roles' => function ($q){
        $q->select('name')->where('roles.id', 1);
          }])->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...