Я работал над laravel, используя конструкторы красноречивых запросов. У меня есть ситуация, в которой я фильтрую записи на основе поисковых запросов. У меня есть целочисленное поле, для которого я хочу фильтровать данные в диапазонах. Пользователь может выбрать любой из доступных диапазонов, например;
0-15
, 15-30
а также 30 and above
,
Для этого я нашел Query-builders, где очень помогло предложение whereBetween (). Но мне становится трудно для последнего варианта, когда я хочу выбрать для 30 and above
,
Я был бы очень признателен, если бы кто-то мог помочь мне с какой-то хитростью сделать этот запрос
->whereBetween('time_taken', [$lower-limit,$uper_limt])
работает на все случаи.
Я не хочу писать дополнительную строку для этого случая, в которой я могу использовать простой, где предложение
->where('time_taken','>=',$uper_limt)
,
Практическое решение здесь состоит в том, чтобы просто выбрать соответствующее условие SQL (здесь я использую троичный оператор, чтобы сделать его более компактным):
$query = App\Operation::query();
(empty($upper_limit)) ? $query->where('time_taken','>=', $lower_limit)
: $query->whereBetween('time_taken', [$lower_limit, $upper_limit]);
$results = $query->get();
Конечно, было бы неплохо иметь только одну строку:
$results = App\Operation::whereBetween('time_taken', [$lower_limit, $upper_limit])->get();
Но это невозможно в этом случае, если только вы не захотите расширить Laravel Query Builder и изменить способ обработки пустых параметров в диапазоне, переданном в качестве значения.
Написание чистого и краткого кода — это то, чего мы все стремимся достичь, но однострочные решения не всегда возможны. Поэтому мой совет — перестать зацикливаться (то, что я иногда делаю сам) на таких вещах, потому что в некоторых случаях это потерянное дело, которое просто приводит к потере времени.
Вы можете попробовать любой из них:
Способ 1:
->whereBetween('time_taken', [$lower-limit,ModelName::max('time_taken')])
Способ 2:
->whereBetween('time_taken', [$lower-limit,DB::table('table_name')->max('time_taken')])
Способ 3:
$max = ModelName::max('time_taken');
//or
$max = DB::table('table_name')->max('time_taken');
//then
->whereBetween('time_taken', [$lower-limit,$max])
max()
возвращает наибольшее значение из вашего столбца corespondent.