【Laravel】モデルのスコープ
※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂ける場合は自己責任でお願いします。
【目次】
背景
Eloquent触っていたら、スコープの解釈がごちゃごちゃしてきたので、記事にまとめてみます。
以前にスコープについては調べたことがあるのですが、今回はモデルでのスコープの解釈についてまとめます。
モデルのスコープ
スコープとは?
モデルでのスコープは、モデルの範囲を特定するための機能と考えることができます。要は、検索範囲を狭めるための条件をまとめておくことができます。
whereでの検索が『全ての検索において共通する条件』や『条件が多い』場合に、モデルのスコープで条件をまとめておき、検索する時にはすっきりと記述することができます。
ローカルスコープとは?
モデル内でメソッド(スコープ)を用意し、必要に応じてそのメソッドを明示的に呼び出せることです。メソッドを呼び出さないと、スコープは機能しません。
用意するメソッドは、要は「検索条件を設定してBuilderを返すメソッド」です。
ローカルスコープの使い方
public function scope【アッパーキャメルケースの名前】 ($query,引数)
{
///省略
return 絞り込んだクエリビルダ;
}
第一引数の$queryには、Builderインスタンスが渡されます。
このメソッド(スコープ)を呼び出す場合は、メソッド名の最初のscopeは不要です。
グローバルスコープとは?
ブローバルスコープを用意すれば、そのモデルの全てのレコード取得時にスコープが適用されることになります。
グローバルスコープは、決まったメソッドを利用して処理を定義します。
定義するには、以前に記事にしたbootメソッドとaddGlobalScopeメソッドを使ってオーバライドをすることで、グローバルスコープを追加することができます。
グローバルスコープの使い方
protected static function boot()
{
parent::boot;
static::addGlobalScope(スコープ名, function (Buider $builder)
{
///省略
}
}