У меня есть 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, но тогда пользователям нужно проверить положительный результат для каждого выбранного заголовка, чтобы его выбрали. Так что, если бы я хотел искать менеджеров и сотрудников, я мог бы получить ни одного, потому что нет ни одного пользователя с обоими названиями.
Цель:
Дополнительные комментарии:
Я знаю, что мог бы также исключить любую другую модель вместо поиска нужных моделей. Если бы я искал менеджеров и сотрудников, я мог бы установить где («CEO», «! =», 1) для каждого нежелательного заголовка. Я не хочу этого, потому что пользователи с двумя названиями, такими как сотрудник и промежуточный, в некоторых случаях будут исключены.
Я знаю, что мог бы написать вложенные условные запросы для каждого сценария, т.е. & Генеральный директор, временно & Генеральный директор & исполнительный и так далее …), но это займет 25 запросов и просто не будет легко масштабируемым (экспоненциально больше запросов), если будут добавлены дополнительные пользовательские заголовки.
Это должно быть красноречивое решение.
Пользователи могут иметь несколько названий.
Я много думал об этой проблеме, спасибо!
Может быть, вы можете сделать что-то подобное? (с использование ключевое слово 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();
Других решений пока нет …