Scopeを実例を交えて解説【Laravel】

Laravel

laravelのScopeについて実例を踏まえて詳しく知りたい!

こういった悩みを持っている方への記事です。

筆者は現在Laravelの学習中でして、学習中の気づきやまとめをブログを通してアウトプットしています。

自分自身が開発の最中にハマったところや理解しにくかったところを重点的にピックアップしてまとめています。

今回は、レコードを絞り込む際のScopeについて解説します。

5分で読めるので、Laravelのリレーションについて知りたい方は最後まで読んでみてください。

Scopeとは?

データベースからデータを取得する際に、取得したい情報だけに絞るためのlaravelに備えられている機能です。

そもそもscopeとは、日本語訳に「範囲」と訳されます。

範囲を限定してテーブルからレコードをとってくるための機能と考えるとわかりやすいですね。

Scopeは2種類ある

Scopeには

  • グローバルスコープ
  • ローカルスコープ

の2種類があります。

グローバルスコープとは

グローバルスコープとは、グローバルスコープを指定したモデル内では、いつでもすべてのクエリに対して絞り込みが可能になる機能です。

レコード絞り込みの際に、全体に共通する絞り込みをあらかじめ設定しておける機能ですね。

ローカルスコープとは

ローカルスコープによりアプリケーション全体で簡単に再利用可能な、一連の共通制約を定義できます。

ローカルスコープは、グローバルスコープとは異なり、全体には共通でない特定の絞り込み条件を一つのメソッドにあらかじめまとめておいて、必要な時に適宜使用する機能です。

ローカルスコープの実例

今回は、簡単な検索機能のスコープを実例に見ていきます。

スコープする前のコントローラ

$search = request()->query('search');

if ($search) {
$posts = $category->posts()->where('title', 'LIKE', "%{$search}%"); //<---where句で絞り込み
} else {
 $posts = $category->posts();
};

コントローラー内でレコードを絞り込む処理を完結させています。

scopeをモデルクラスに記載

上記コントローラに記載の処理を、scopeにまとめます。

public function scopeSearched($query) { //①、②
  $search = request()->query('search');

  if(!$search)
  {
    return $query;
  }

  return $query->where('title', 'LIKE', "%{$search}%");
}

解説

①引数にある$queryは、illuminate\Database\Eloquent名前空間にあるBuilderクラスのインスタンスです。

②ローカルスコープには、メソッド名に接頭辞としてscopeをつけます。

コントローラで使う

return view('blog.category')
      ->with('posts', $category->posts()->searched())

モデルに定義したscopeは、定義したモデルのメソッド(クエリビルダ )として使うことができます。

コントローラーで使用する際は、モデルで定義したメソッド名のscopeを外した形で記述します。

まとめ

今回は、LaravelのScopeについて解説しました。

コントローラーファイルに記載していたレコード取得の絞り込み処理を、スコープを作成することでメソッドにまとめることができます。

レコード取得の絞り込み処理を毎回書く必要がなくなり、必要な時に呼び出せばいいだけなので、コードの見通しもよくなります。

絞り込みの処理を効率的にまとめて、コードの見通しをよくしていきたいですね。

ご指摘等ございましたら、ご遠慮なくおっしゃっていただけますと幸いです。

参考サイト

【Laravel】スコープを使えば「うっかり」が減って「ラク」できる – console dot log
Eloquent:利用の開始 5.4 Laravel
【Laravel】毎回同じ検索条件を書くならEloquentのクエリスコープを使う - Qiita
3年弱Laravelを使っていたのに、今まで存在を知らなかった便利な機能「クエリスコープ」を使ってみました。 こんなケース ブログサイトを作っていたとして、記事データを取得する機会って結構あると思います。 検索結果を表示する...
【Laravel】ローカルスコープについて解説 | とものブログ
ローカルスコープを利用する事でより保守しやすいシステムになります。ローカルスコープを利用したい方に分かりやすく解説していますので是非ご一読下さい。