Как настроить предложение Laravel whereBetween, чтобы верхний предел был неограниченным?
Я работал над 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)
,
2 ответа
Практическое решение здесь состоит в том, чтобы просто выбрать подходящее условие 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.