検索とスコープ

whereの使い方

ID以外で検索するときはwhereを使う。
$変数 = モデルクラス::where(フィールド名 , 値)->get;
$変数 = モデルクラス::where(フィールド名 , 値)->first;

スコープ

 条件を絞り込むためのもので、ローカルスコープとグローバルスコープがある。

ローカルスコープ

モデル内にメソッドを用意しておき、必要なときに呼び出して使うもの。

Personモデル
public function scopeNameEqual($query, $str)
   {
       return $query->where('name', $str);
   }

PersonController
public function search(Request $request)
   {
       $item = Person::nameEqual($request->input)->first();
       $param = ['input' => $request->input, 'item' => $item];
       return view('person.find', $param);
   }

PersonControllerでスコープを呼び出すときはメソッド名の最初のscopeと第一引数の$queryは不要になる。

スコープの組み合わせ
〜以上、〜以下という条件をスコープを用意して、組み合わせて絞り込む。
scopeをつなげることで組み合わせることができる。PersonモデルPersonモデル

public function scopeAgeGreaterThan($query, $n)
   {
       return $query->where('age', '>=', $n);
   }

   public function scopeAgeLessThan($query, $n)
   {
       return $query->where('age', '<=', $n);
   }

PersonController
public function search(Request $request)
   {
       $min = $request->input * 1;
       $max = $min + 10;
       $item = Person::ageGreaterThan($min)->ageLessThan($max)->first();
       $param = ['input' => $request->input, 'item' => $item];
       return view('person.find', $param);
   }

グローバルスコープ

処理を用意しておくことでモデルのすべてのレコード取得にスコープが適用される。

bootメソッド
モデルが作成される際の初期設定のメソッド。
addGlobalScopeではbuilderを使ってスコープを絞り込んでいる。引数のBuilderを使って絞り込むことで、すべての検索処理に適応されるようになる。

protected static function boot()
   {
       parent::boot();

       static::addGlobalScope('age', function (Builder $builder) {
           $builder->where('age', '>', 20);
       });
   }

scopeクラス

scopeクラスを使うと、グローバルスコープを複数使うときに、Personモデルに書くコードの量を減らせる。

Personモデル
protected static function boot()
   {
       parent::boot();
       static::addGlobalScope(new ScopePerson);
   }
 
Scopeクラス
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class ScopePerson implements Scope
{
   public function apply(Builder $builder, Model $model)
   {
       $builder->where('age', '>', 20);
   }
}

Personモデルのstatic::addGlobalScopeの引数にnew ScopePersonとすることで、ScopePersonがグローバルスコープとして追加される。

この記事が気に入ったらサポートをしてみませんか?