(954) 302-0839

クエリスコープの概要

モデルに対する制約を設定する。実装的にはクエリに対する条件式を設定したメソッドを定義し、メソッドチェーン形式で呼び出せるようにする。

参考リンク
Eloquent#Query Scopes
8324219789

グローバルスコープ

ローカルスコープ

対象モデルのメソッドとして、プリフィックスscopeを指定したメソッドを定義する。

public function scopeActive($query) {
    return $query->where('active', 1);
}

こうすることで、Controllerなどでやりがちな

$users = User::where('active', 1)->get();

みたいなコードを

$users = User::active();

と記述できるようになるから嬉しいね!!

考察

グローバルスコープを自分で記述したことはなかったんだけど、softDelete で利用されているってことなので、うまく書き換えられたケースはあったかなって。trait + グローバルスコープって言う形で、機能の差し込みが必要になりそうなときは、積極的に使ってみると良いかも。

ローカルスコープについては、テーブルのフィールドにenumかboolがある場合には真っ先に定義してしまうのが吉。これ、定義しないと気づかないうちにwhere('active', 1) が産卵して辛い。
ダイナミックスコープは便利だけど(個人的には)あまり使いたくない感じかな。ドキュメントの例にある admin をとっても

User::typeOf('admin')

よりも

User::isAdmin()

で指定したほうが、意図が伝わりやすい。

後述するけど、スコープというのは「ある集合から特定条件の集合を切り出す」操作なので、切り出した後のことを考えると、typeOfはクエリベースに寄りすぎている気がする。

スコープで取得した集合は「特定条件を満たす集合」になるので、

$users = User::active()

で取得できる集合はUserCollectionよりもActiveUserCollectionと考えたい。そのため、クエリスコープを使う場合はできるだけカスタムコレクションも一緒に定義すると、設計レベルでスッキリします。