Как настроить предложение 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.

Другие вопросы по тегам