撰写复杂的Laravel雄辩的声明

时间:2018-03-14 13:05:20

标签: php laravel laravel-5 eloquent laravel-eloquent

我需要使用Laravel Eloquent ORM执行以下MySQL查询:

select * from `events`
where `app_id` = 1
   and ((`startDate` < now() and endDate is null) or (`endDate` < now())) 
order by `startDate` desc

到目前为止我最好的尝试:

Event::where('app_id', '=', 1) 
    -> where(function ($query) {
        $query -> where([['startDate', '<', Carbon::now() -> toDateTimeString()]) -> whereNull('endDate');
}) -> orWhere([['endDate', '<', Carbon::now() -> toDateTimeString()]])
-> orderBy('startDate', 'desc') -> get();

这不是我想要的结果:

select * from `events`
where `app_id` = 1
   and (`startDate` < now() and endDate is null) or (`endDate` < now()) 
order by `startDate` desc

(在条件第二种化合物中缺少额外的括号)。

有什么想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

这应该完成任务:

Event::where('app_id', '=', 1) 
->where(function ($q) {
    $q->where(function($query){
          $query->where('startDate', '<', Carbon::now()->toDateTimeString())->whereNull('endDate');
     })->orWhere('endDate', '<', Carbon::now()->toDateTimeString());
})
->orderBy('startDate', 'desc') -> get();