Задать вопрос
@OlegSedoy

Запрос к БД в цикле. Нужно ли использовать кеш?

Есть сайт, где на стороне клиента происходит запись по времени.

БД Заказы:

Schema::create('orders', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('phone');
            $table->string('email')->nullable();
            $table->string('comment')->nullable();
            $table->boolean('status')->default(true);
            $table->date('date');
            $table->string('service');
            $table->string('price');
            $table->time('time');
            $table->string('description')->nullable();
            $table->timestamps();
        });

На стороне клиента я проверяю, не занято ли время на выбранную дату:

@foreach($times->sortBy('time') as $time)
                                    <div class="form__radio">
                                        <input class="form__radio-input" type="radio" name="time"
                                               id="budget-{{$time->id}}" value="{{$time->time->format(config('app.time_format'))}}"
                                               @if($time->isDisabled($date) || $time->isOrder($date)) disabled
                                               @endif  @if(old('time') == $time->time->format(config('app.time_format'))) checked @endif" >
                                        <label class="form__radio-label"
                                               for="budget-{{$time->id}}">{{$time->time->format('H:i')}}</label>
                                    </div>
                                @endforeach

Метод, который проверят isOrder:

public function isOrder($date): bool
    {
        return Order::active()
            ->date($date)
            ->where('time', $this->time->format(config('app.time_format')))
            ->exists();
    }

Получаются множество запросов к БД. Вопрос: нужно ли здесь использовать кеш или нужно менять логику бронирования? Опять же, если использовать кеш, то он должен быть динамическим на каждую дату?
  • Вопрос задан
  • 84 просмотра
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Я бы создал небольшую заранее заполненную таблицу с тайм-слотами.
`timeslots` (`time` TIME);
SELECT `s`.`time`, `o`.`time` IS NULL AS `free`
  FROM `timeslots` AS `s`
  LEFT JOIN `orders` AS `o`
    ON `o`.`date` = :date AND `o`.`time` = `s`.`time`

Или
SELECT `time`
  FROM `timeslots`
  WHERE `time` NOT IN (
    SELECT `time`
      FROM `orders`
      WHERE `date` = :date
  )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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