Laravel雄辩模型范围多准则

Laravel雄辩模型范围多准则,laravel,laravel-5,scope,model,eloquent,Laravel,Laravel 5,Scope,Model,Eloquent,关于我的Laravel雄辩模型中范围的定义,我有一个问题 情况: 型号为“Subscription”,具有a.o.属性“startdate”和“enddate”。Startdate为必填项,Enddate可选填写或为空 我定义了“活动”范围,如下所示: public function scopeActive($query) { return $query->whereDate('startdate', '<', Carbon::now())->where

关于我的Laravel雄辩模型中范围的定义,我有一个问题

情况: 型号为“Subscription”,具有a.o.属性“startdate”和“enddate”。Startdate为必填项,Enddate可选填写或为空

我定义了“活动”范围,如下所示:

public function scopeActive($query)
    {
        return $query->whereDate('startdate', '<', Carbon::now())->whereDate('enddate', '>', Carbon::now());
    }
public函数作用域活动($query)
{
返回$query->whereDate('startdate','',Carbon::now());
}
Bat正如您所看到的,当enddate被填充时(用将来的日期,但是如何添加我的startdate早于今天,并且enddate为null的条件),这种方法可以很好地工作

我假设有一个合适的解决方案,但在文档中找不到。

您可以使用:

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');
         });
    });
}
public函数作用域活动($query)
{
返回$query->where(函数($q){
$q->where(函数($q){
$q->whereDate('startdate','',Carbon::now()->toDateString());
})->orWhere(函数($q){
$q->whereDate('startdate','',Carbon::now()->toDateString());
->或wherenull(“结束日期”);
});
});
}

您应该使用参数化作用域

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

}
公共函数作用域活动($query,$param)
{
if(isset($param))返回$query->whereDate('startdate','',$param);

return$query->whereDate('startdate','我更喜欢第二个解决方案!我实现了这个解决方案,并且工作得非常完美。只有一个小问题:以$qThnx开头的行中有一个分号太多,都是为了考虑解决方案
public function scopeActive($query, $param)
{
 if(isset($param)) return $query->whereDate('startdate', '<', Carbon::now())->whereDate('enddate', '>', $param);
return $query->whereDate('startdate', '<', Carbon::now());

}