検索とスコープ
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がグローバルスコープとして追加される。
この記事が気に入ったらサポートをしてみませんか?