Laravel 模型的 scope 普通用法和全域性用法

Youris發表於2019-10-08

在專案中 經常會面對一些條件的查詢,這些查詢條件好些是相同的。scope可以實現這些相同條件的複用.

普通scope
定義,函式名稱為scope+首字母大寫Active(這個名稱隨意)

public function scopeActive($query)
{
    return $query->where('active',1);
}

使用,正常使用,其中呼叫去掉scope後,首字母小寫的那個函式。scopeActive()呼叫active()。

$user = \App\User::popular()->active()->orderBy('created_at','desc')->get();

全域性scope

protected static function boot()
{
    parent::boot(); // TODO: Change the autogenerated stub
    static::addGlobalScope('avaiable',function (Builder $builder){
        $builder->whereIn('status',[0,1]);
    });
}

我們需要重新定義boot方法,整合父類boot以後,新增全域性scope,這樣預設就已經全域性使用了。

那麼,我們有的時候有的查詢是不需要這個全域性scope的時候怎麼辦呢?去掉就可以

$posts = Post::withOutGlobalScope('avaiable')->orderBy('created_at','desc')->paginate(10);

相關文章