Laravel雄辩模型的范围多个标准

时间:2018-08-18 12:23:08

标签: laravel laravel-5 scope model eloquent

我对Laravel Eloquent模型中的范围定义有疑问

情况: 模型是“订阅”,具有属性“开始日期”和“结束日期”。开始日期是必填项,可以选择填写结束日期或为空

我将作用域定义为“活动”,如下所示:

public function scopeActive($query)
    {
        return $query->whereDate('startdate', '<', Carbon::now())->whereDate('enddate', '>', Carbon::now());
    }

如您所见,当填充完结束日期(带有将来的日期)时,它可以很好地工作,但是我该如何添加开始日期早于今天且结束日期为null的条件。

我认为有一个适当的解决方案,但在文档中找不到。

2 个答案:

答案 0 :(得分:0)

您可以使用:

defaultValue

但是因为在两种情况下开始日期都应该是过去,所以您可以使用:

public function scopeActive($query)
{
   return $query->where(function($q) {
         $q->where(function($q) {
               $q->whereDate('startdate', '<', Carbon::now()->toDateString())
                 ->whereDate('enddate', '>', Carbon::now()->toDateString());
         })->orWhere(function($q) {
               $q->whereDate('startdate', '<', Carbon::now()->toDateString())
                 ->whereNull('enddate');
         });
    });
}

答案 1 :(得分:0)

您应该使用参数化作用域

public function scopeActive($query, $param)
{
 if(isset($param)) return $query->whereDate('startdate', '<', Carbon::now())->whereDate('enddate', '>', $param);
return $query->whereDate('startdate', '<', Carbon::now());

}

Local Scopes