Laravel scope用法

sgm4231發表於2021-02-01

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

普通用法:

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

public function scopeWithLastPost($query)
{
    return $query->addSelect([
        'last_post_id' => Post::select(['id'])
            ->whereColumn('user_id', 'users.id')
            ->where('status', Post::STATUS_NORMAL)
            ->orderByDesc('created_at')
            ->limit(1)
    ])->with('lastPost:id,title,user_id,created_at');
}

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

$users = User::select($columns)->withLastPost()->orderByDesc('id')->paginate(20);

全域性 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);

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章