Добавить условие и присоединения к связанным таблицам в laravel - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть пользовательская таблица, и в ней есть userRole.Я хочу добавить условие, которое выбирает всех пользователей, имеющих "role_id" 1, который находится в userRole.

Отношение в пользовательской модели:

public function userRole() 
{   
  return $this->hasOne(UserRole::class); 
}

И код контроллера:

$users = User::with(["userRole" => function ($query){
                        $query->where('role_id', 1);   
                    }])->get();

Это не работает нормально.Он выбирает всех пользователей и выбирает userRole в случае, если его role_id равен 2, в противном случае userRole пуст.

Ответы [ 4 ]

0 голосов
/ 23 февраля 2019

Объяснение:

with() используется для ускорения загрузки.Таким образом, в основном использование with('userRole') даст вам все роли для этого конкретного пользователя.

Когда вы используете:

User::with(["userRole" => function ($query){
     return $query->where('role_id', 1);   
}])->get();

Вы говорите Laravel, дайте мне всех пользователей и их роли, но роливыбранный должен иметь только role_id из 1.Не выбирайте роли, отличные от этого условия.

В Laravel есть функция whereHas, которая ничего не выбирает, но фильтрует родительские отношения на основе состояния ребенка.

Например.нам нужно получить пользователей с идентификатором роли 1:

User::wherehas('userRole', function ($q) {
    return $q->where('role_id','1');
})->get();

Теперь Laravel скажет, чтобы я получил всех пользователей, у которых по крайней мере 1 запись userRoles с role_id 1.

Thisбудет просто фильтровать пользователей на основе соотношения ролей.Однако нам нужно отдельно добавить предложение with(), чтобы получить роли.

User::with('userRole')->wherehas('userRole', function ($q) {
    return $q->where('role_id','1');
})->get();
0 голосов
/ 23 февраля 2019

Это может вам помочь.Пожалуйста, попробуйте добавить приведенный ниже фрагмент в ваш контроллер

User::with(['userRole'])->wherehas('userRole', function ($query) {$query->where('role_id','1');})->get();
0 голосов
/ 23 февраля 2019

Есть решение, которое мы можем сделать, где

User::with(['userRole'])->wherehas('userRole', function ($query) {$query->where('role_id','1');})->get(); 
0 голосов
/ 23 февраля 2019

Попробуйте загрузить обратную связь.Примерно так:

// in UserRole.php file
public function users() 
{   
  return $this->hasMany(User::class); 
}

и ваш запрос вот так:

$role = UserRole::with("users")->where('id', 2)->get();
$users = $role->users;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...