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