我有以下查询:
$input_datestart = date("Y-m-d", strtotime($data["date_start"]));
$input_dateend = date("Y-m-d", 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
将事件ID链接到具有内部联接的表events
我需要检索给定日期范围内的所有重复事件
来自' events_dates_recurrent'的end_date表格现在可以忽略,也许这可能会在以后用作目的,但这个查询并不是严格要求的。
答案 0 :(得分:0)
我对这个解决方案并不是特别满意,但是它做了它应该做的事情:
我基本上做的是循环输入日期间隔并创建一个动态查询字符串
我的应用程序始终将请求的日期/时间间隔限制为@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('Y-m-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);
});