У меня есть следующий запрос:
$input_datestart = date("Ymd", strtotime($data["date_start"])); $input_dateend = date("Ymd", strtotime($data["date_end"])); //Calculate the recurrent dates $query = $query->join('events_dates_recurrent', 'events.id', '=', 'events_dates_recurrent.event_id') ->whereRaw("ABS(DATEDIFF('" . $input_datestart . "', CAST(events_dates_recurrent.start_date AS DATE)) % events_dates_recurrent.repeat_interval) = 0");
В течение одного дня я получаю желаемый результат, который должен получать повторяющиеся события из моей базы данных для заданного start_date.
Однако, когда задан диапазон дат (т. Е. Дата начала и окончания), я не уверен, как получить все результаты в одном запросе, избегая цикла, принимая во внимание, что повторяющиеся события все еще должны быть извлечены.
Какие-либо предложения?
Изменить : структура таблицы довольно проста:
Таблица events_dates_recurrent
:
event_id | start_date | end_date | repeat_interval
Если идентификатор события связан с events
таблицы с внутренним соединением.
Мне нужно получить все повторяющиеся события в пределах определенного диапазона дат.
End_date из таблицы «events_dates_recurrent» можно игнорировать на данный момент, возможно, это может служить цели позже, но это не является обязательным условием для этого запроса.
Я не очень удовлетворен этим решением, но он делает то, что он должен делать: то, что я в основном делаю, это цикл через интервал дат ввода и создание динамической строки запроса.
Мое приложение всегда ограничивает запрошенный интервал времени и времени до @maximum 1 месяц, поэтому строка запроса никогда не должна превышать максимальный предел строки.
Я не 100% о производительности, но мы увидим, как это работает.
//Calculate the recurrent dates $query = $query->join('events_dates_recurrent', 'events.id', '=', 'events_dates_recurrent.event_id') ->where(function($join) use ($input_date_start, $input_date_end) { //Create a dynamic query to get all recurrent dates within the input time interval $query_string = "ABS(DATEDIFF('" . $input_date_start . "', CAST(events_dates_recurrent.start_date AS DATE)) % events_dates_recurrent.repeat_interval) = 0"; $temp_date_start = $input_date_start; while(strtotime($temp_date_start) <= strtotime($input_date_end)){ $temp_date_start = date('Ym-d',strtotime($temp_date_start . " +1 day")); //Create a raw query string $query_string = $query_string . " OR ABS(DATEDIFF('" . $temp_date_start . "', CAST(events_dates_recurrent.start_date AS DATE)) % events_dates_recurrent.repeat_interval) = 0"; } $join->whereRaw($query_string); });