Как настроить предложение 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 и изменить способ обработки пустых параметров в диапазоне, переданном в качестве значения.


Написание чистого и краткого кода — это то, чего мы все стремимся достичь, но однострочные решения не всегда возможны. Поэтому мой совет — перестать зацикливаться (то, что я иногда делаю сам) на таких вещах, потому что в некоторых случаях это потерянное дело, которое просто приводит к потере времени.

4

Другие решения

Вы можете попробовать любой из них:

Способ 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.

1

По вопросам рекламы [email protected]