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