laravel查询:orWhere:double condition

时间:2014-12-30 15:18:13

标签: php mysql laravel laravel-4 orm

我有以下查询,但没有给出预期的结果:

    $query = $query->join('events_dates', function($join) use ($data){ 
                $join->on('events.id', '=', 'events_dates.event_id')
                        ->where('events_dates.start_date', "<=", date_format(date_create($data['date_end']), "Y-m-d"))
                        ->where('events_dates.end_date', '>=', date_format(date_create($data['date_start']), "Y-m-d"))
                        ->orWhere('recurrent', "=", 1)
                        ->where((strtotime($data["date_start"]) - strtotime('event_dates.start_date')) % ('events_dates.repeat_interval' * 86400), '=', 0); 
            }); 

此查询中有4个where子句。 要求是执行两个第一个where子句,或者根据recurrent字段执行两个最后一个子句。

PHP返回错误division by zero,因为recurrent0时不应执行最后一个Where子句。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我不知道你的确切目标,也不知道你的数据库是什么,所以这只是一个疯狂的猜测:

$query = $query->join('events_dates', function($join) use ($data){ 
            $join->on('events.id', '=', 'events_dates.event_id')
                    ->where('events_dates.start_date', "<=", date_format(date_create($data['date_end']), "Y-m-d"))
                    ->where('events_dates.end_date', '>=', date_format(date_create($data['date_start']), "Y-m-d"))
                    ->orWhere('recurrent', "=", 1)
                    ->whereRaw('DATEDIFF(?, event_dates.start_date) % event_dates.repeat_interval = 0', array($data['date_start']));

更新

这可能有助于两个日期之间的部分

->where('events_dates.start_date', '<=', new Carbon($data['date_end']))
->where('events_dates.end_date', '>=', new Carbon($data['date_start']))