首页 文章

Laravel Eloquent模型范围多个标准

提问于
浏览
0

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

情况:模型是'订阅',它有a.o.属性'startdate'和'enddate' . Startdate是必需的,Enddate可选地填充或为null

我将范围'Active'定义如下:

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

蝙蝠你可以看到,当enddate被填满时这很好用(将来会有一个日期,但我怎么能添加我的startdate早于今天的条件,enddate为null .

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

2 回答

  • 0

    你可以使用:

    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');
             });
        });
    }
    

    但因为在两种情况下startdate应该在过去你可以使用:

    public function scopeActive($query)
    {
       return $query->whereDate('startdate', '<', Carbon::now()->toDateString())
                    ->where(function($q) {
                         $q->whereDate('enddate', '>', Carbon::now()->toDateString());
                           ->orWhereNull('enddate');
                      });
              });
    }
    
  • 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

相关问题