Laravel collection 带有 or 运算符的多个日期过滤器

Laravel collection with multiple date filter with or operator

我正在尝试从 Laravel 5.7 中的 Collection 中筛选多个项目。这些项目有一个开始日期和一个(可选的)结束日期。

我要创建的过滤器如下。

startdate <= now() AND

( enddate >= now() OR enddate = '' OR enddate = NULL )

我已经尝试了以下但它不起作用:

$this->items->where([  
  ['startdate', '<=', date('Y-m-d'))],
  ['enddate', '>=', date('Y-m-d')]
])->orWhere([
  ['startdate', '<=', date('Y-m-d'))],
  ['enddate', '=', '']
])->orWhere([
  ['startdate', '<=', date('Y-m-d'))],
  ['enddate', '=', null]
]);

更简洁的方法是使用这样的闭包:

$this->items->where('startdate', '<=', date('Y-m-d'))
            ->where(function($q) {
                 $q->where('enddate', '>=', date('Y-m-d'))
                   ->orWhere('enddate', '')
                   ->orWhereNull('enddate');
             });

并且可能正如评论中所建议的那样,您实际上应该使用 items() 而不是 items 因为使用 items 您可能会从数据库中获取元素,而不是之前向数据库查询添加约束。

感谢 Marcin Nabialek,我找到了解决方案。

我不得不使用 $this->items() 而不是 $this->items,并且不得不在其后附加 ->get() 函数。

结果:

$this->items()->where('startdate', '<=', date('Y-m-d'))
              ->where(function($q) {
                  $q->where('enddate', '>=', date('Y-m-d'))
                    ->orWhere('enddate', '')
                    ->orWhereNull('enddate');
              })->get();