带有带有或运算符的多日期过滤器的Laravel集合

时间:2018-12-09 22:58:38

标签: laravel laravel-5 eloquent where-clause laravel-5.7

我正在尝试从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]
]);

2 个答案:

答案 0 :(得分:0)

更干净的方法是使用像这样的闭包:

$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可能会从数据库中获取元素,而不是之前向数据库查询添加约束。

>

答案 1 :(得分:0)

多亏了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();