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’s на where, но тогда пользователям нужно проверить положительный результат для каждого выбранного заголовка, чтобы его выбрали. Так что, если бы я хотел искать менеджеров и сотрудников, я мог бы получить ни одного, потому что нет ни одного пользователя с обоими названиями.

Цель:

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

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

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

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

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

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

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

0

Решение

Может быть, вы можете сделать что-то подобное? (с использование ключевое слово 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();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]