У меня есть 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, но тогда пользователям нужно проверить положительный результат для каждого выбранного заголовка, чтобы его выбрали. Поэтому, если бы я хотел найти менеджеров и сотрудников, я мог бы ничего не найти, потому что нет ни одного пользователя с обоими титулами.
Цель:
- Я хочу добавить все эти условные «заголовки-запросы» вместе.
- Поместите их все в один where(function($query) {$query->[all 'title-queries']; }).
Дополнительные комментарии:
Я знаю, что я мог бы также исключить любую другую модель вместо того, чтобы искать нужные модели. Если бы я искал менеджеров и сотрудников, я мог бы установить where('CEO', '!=', 1) для каждой нежелательной должности. Я не хочу этого, потому что пользователи с двумя должностями, такими как сотрудник и временно исполняющий обязанности, в некоторых случаях будут исключены.
Я знаю, что могу написать вложенные условные запросы для каждого сценария, т. е. (менеджер и генеральный директор, исполняющий обязанности и генеральный директор и исполнительный директор и т. д.), но это займет 25 запросов и просто не легко масштабируется (экспоненциально больше запросов), если дополнительный пользователь добавляются заголовки.
Это должно быть красноречивое решение.
Пользователи могут иметь несколько титулов.
Я долго думал над этой проблемой, спасибо!