在專案中 經常會面對一些條件的查詢,這些查詢條件好些是相同的。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 協議》,轉載必須註明作者和本文連結