@EVOSandru6

Как в запросе по тарифу выполнить округление к нижнему порогу или к верхнему, если нижнего нет?

Добрый день.

Есть такая структура:

services
-------------
id

prices
-------------
service_id
days
price


В итоговую таблицу заказа мне нужно сгенерировать цену по такому принципу.

Например для одной услуги в таблице prices имеются записи:

id | service_id | days | price
-----------------------------------
1 | 1 | 3 | 100
2 | 1 | 5 | 200
3 | 1 | 10 | 300

Мне нужно, чтобы если при наличие нижнего порогового значения, либо соответствии текщего, выбирался данный вариант, например:

Выбираем 4 дня, получаем - запись с id=1
Выбираем 5 дня, получаем - запись с id=2
Выбираем 22 дня, получаем - запись с id=3

Если же нижнего порогового значения нет, то вытаскиваем с минимальным кол-вом дней, например:

Выбираем 1-2 дня, получаем - запись с id=1

Иначе exception/null/0

Подскажите - как сделать такой запрос через запрос или Eloquent? Можно ли в 1-2 действий это проделать?
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
@EVOSandru6 Автор вопроса
Пока сделал так, но не нравится:

$prices_min = $this->prices()->limit(1)->orderBy('days')->first();

        if($days < $prices_min) {
            return $prices_min;
        }

        $exact_match = $this->prices()->where('days','=',$days)->first();

        if($exact_match) {
            return $exact_match;
        }

        $smaller = $this->prices()->where('days','<',$days)->first();

        if($smaller) {
            return $smaller;
        }

        throw new NotFoundException('Not Found');


Либо чуть покороче:

$prices_min = $this->prices()->limit(1)->orderBy('days')->first();
        if($days < $prices_min) {
            $price = $prices_min;
        }

        $exact_match = $this->prices()->where('days','=',$days)->orWhere('days','<',$days)->orderByDesc('days')->first();
        if($exact_match) {
            $price = $exact_match;
        }


Но кажется можно получше сделать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы