Как исключить записи, которые имеют загруженные отношения, но пустые, в самом красноречивом запросе - PullRequest
0 голосов
/ 22 апреля 2019

Когда я загружаю отношения с помощью красноречивых методов, некоторые записи имеют пустые отношения. Я могу отфильтровать записи, просто используя метод фильтра коллекции. Как я могу отфильтровать эти записи при запросе?

У меня несколько пользователей, и у каждого пользователя может быть несколько ролей (Администратор, Сотрудник, Пользователь). В сценарии я хочу перечислить всех пользователей, которые имеют роли сотрудника. Я нетерпеливо загружал роли (ограниченные сотрудником) для пользователей. Но пользователи без роли сотрудника также присутствовали в результирующих данных.

Таким образом, я должен либо отфильтровать эти данные, используя метод сбора данных, либо пропустить загрузку с нетерпением и использовать «отношение запросов». Но тогда это может занять много времени, если количество пользователей увеличится в базе данных.

//filtering out in collection
$employees = User::with(['roles'=> function($query){
                 $query->where('name', 'Employee');
             }])->get()->filter(function($value, $key){
                 return $value->roles->count() > 0;
             });

//querying relationship
$employees = User::whereHas('roles', function($query){
                 $query->where('name', 'Employee');
             })->get();

Я также пытался использовать 'with' и 'whereHas' вместе. Но использование того же самого в другом большом наборе данных заняло больше времени, чем использование «with». Так что я просто отбросил эту опцию.

Итак, есть ли способ получить только тех пользователей, у которых есть роли сотрудников, если они использовали 'with'?

...