大田区から発信するゆるゆる日記

主にITエンジニアに関する備忘録日記。たまに趣味も。何か不備があればコメント頂けると幸いです。Twitterアカウント https://twitter.com/ryuzan03

【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)
{
///省略
}
}