Laravel – ローカルスコープクエリー

概要

ローカルクエリースコープを使うと、特定モデルに必要なクエリービルダーに名前を付けて、1つのメソッドとして呼び出すことができる。

準備

クエリービルダーで使ったOrderCustomerのモデルとテーブルを使う。

それぞれのモデルでリレーションを定義している。

手順

ローカルスコープのクエリービルダーは、次の手順で定義する。

  • 対象のモデルでメソッド定義
    • 'scope'に続いてキャメルケースでメソッド名を定義
    • 第1引数にクエリー($queryなど)
    • ビルダーに引数を渡したいときは第2引数以降に加える
    • メソッド内の戻り値は、第1引数のクエリーに対してビルダーを組んだ結果を渡す
  • 定義したメソッドをビルダーの様に呼び出す
    • 呼び出す際は'scope'を除いたメソッド名で呼び出す

例1:引数なし

たとえばordersの最新3データのみ取り出す定形操作があるとする。このとき、Orderモデルで以下の様にメソッドを定義する。

メソッド名は頭に'scope'を付けてscopeLatest3()として、クエリーを受け取る引数に$queryを設定。

tinkerでこれを利用してみる。呼び出す際は’scope’を付けずにlatest3()とし、$queryに対応する引数は渡す必要はない。

生成されるSQLは以下のとおり。

例2:引数を渡す場合

モデルでのメソッド定義の第2引数以下に、渡したい引数を列挙する。以下の例ではcustomer_idを渡し、これに合致するordersのデータを抽出している。

実行時に渡したい引数は、第2引数custome_idで定義している。

tinkerで引数にcustoer_id=1を渡して実行してみる。

生成されるSQLとバインドされる値は以下のとおり。

例3:子モデルが絡む場合

ビルダーに引数を渡して、子モデルの条件で抽出したい場合。whereHas()を使うが、引数に渡すクロージャ―の変数はローカルスコープのため、useで引数の変数を受け取って渡す。

tinkerでcustomer_name='customer2'を渡して確認。

生成されるSQLとバインドされる値は以下のとおり。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です