Laravel Eloquent ORM: построение вложенных условных запросов

У меня есть 5 пользовательских титулов, определенных логическими значениями: генеральный директор, исполнительный директор, менеджер, сотрудник и стажер.

Я создаю API поиска пользователей и хочу включать/выключать красноречивые запросы, возвращая пользователей с выбранными заголовками.

Поэтому, если бы мне нужно было искать менеджеров и сотрудников, запрос должен быть

$users = User::where(function($query) 
{
   $query->orWhere('manager')->orWhere('employee');
})
->where([ADDITIONAL CONSTRAINTS... (like age)])->get();

Самое далекое, что я пришел, это:

$query = User::query();

//the respective titles are turned on by 1 and turned off by 0
if($CEO) {
$query = $query->orWhere('CEO');
}

if($executive) {
$query = $query->orWhere('executive');
}

//And so on for each title

В конце добавляются дополнительные ограничения where следующим образом:

$users = $query->where([Additional constraints])->get();

При поиске менеджеров и сотрудников окончательный запрос будет таким:

$users = User::orWhere('manager')->orWhere('employee')

->where([ADDITIONAL CONSTRAINTS... (like age)])->get();

Результатом этого запроса является то, что дополнительные ограничения не всегда выполняются, потому что ранее были запросы orwhere, которые позволяют выбирать нежелательные экземпляры.

Я попытался заменить orWhere's на where's, но тогда пользователям нужно проверить положительный результат для каждого выбранного заголовка, чтобы его выбрали. Поэтому, если бы я хотел найти менеджеров и сотрудников, я мог бы ничего не найти, потому что нет ни одного пользователя с обоими титулами.

Цель:

  1. Я хочу добавить все эти условные «заголовки-запросы» вместе.
  2. Поместите их все в один where(function($query) {$query->[all 'title-queries']; }).

Дополнительные комментарии:

  1. Я знаю, что я мог бы также исключить любую другую модель вместо того, чтобы искать нужные модели. Если бы я искал менеджеров и сотрудников, я мог бы установить where('CEO', '!=', 1) для каждой нежелательной должности. Я не хочу этого, потому что пользователи с двумя должностями, такими как сотрудник и временно исполняющий обязанности, в некоторых случаях будут исключены.

  2. Я знаю, что могу написать вложенные условные запросы для каждого сценария, т. е. (менеджер и генеральный директор, исполняющий обязанности и генеральный директор и исполнительный директор и т. д.), но это займет 25 запросов и просто не легко масштабируется (экспоненциально больше запросов), если дополнительный пользователь добавляются заголовки.

  3. Это должно быть красноречивое решение.

  4. Пользователи могут иметь несколько титулов.

Я долго думал над этой проблемой, спасибо!


person Eltyer    schedule 25.10.2016    source источник


Ответы (1)


Может быть, вы можете сделать что-то вроде этого? (с ключевым словом use function)

<?php

$filters = ['manager', 'employee'];

$users = User::where(function($query) use($filters) {
   foreach( $filters as $filter )
      $query = $query->orWhere($filter);
})
->where([ADDITIONAL CONSTRAINTS... (like age)])->get();
person Georges O.    schedule 25.10.2016
comment
Спасибо! Ваше решение работает, единственное изменение, которое я сделал, это добавление {} в цикл foreach. Ваше здоровье - person Eltyer; 26.10.2016