2016-10-25 4 views
0

У меня 5 названий пользователей, определенных booleans: CEO, executive, manager, employee & intern.Laravel Eloquent ORM: Строительство вложенных условных запросов

Я создаю 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 

В конце дополнительного где ограничения добавляются как это:

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

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

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

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

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

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

Цель:

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

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

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

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

  3. Это должно быть Яркое решение.

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

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

ответ

1

Возможно, вы можете сделать что-то подобное?(с use function keyword)

<?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(); 
+0

Спасибо! Ваше решение работает, единственное редактирование, которое я сделал, заключалось в добавлении {} в цикл foreach. ура – Eltyer

Смежные вопросы