编写复杂的 Laravel eloquent where 语句

Composing complex Laravel eloquent where statement

我需要使用 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

(第二个复合 where 条件中缺少额外的括号)。

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

这应该完成任务:

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();