首页 文章

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

提问于
浏览
0

我正在尝试从Laravel 5.7中的 Collection 过滤几个项目 . 这些项目有一个startdate和一个(可选)enddate .

我正在尝试创建的过滤器如下 .

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

    感谢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();
    
  • 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 您可能从数据库获取元素而不是之前向数据库查询添加约束 .

相关问题