目次
Rails にある
方法は大きく分けて2つあります。
モデルクラスを変更する方法
モデル内に次のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App; use IlluminateDatabaseEloquentBuilder; class Item extends Model { protected static function boot() { parent::boot(); static::addGlobalScope('valid', function (Builder $builder) { $builder->where('is_valid', true); }); } } |
addGlobalScope
にクロージャを渡して、 クエリビルダを使うときの処理を加えます。 (Item::where
などでレコードを検索するときもクエリビルダを生成しています。)
解除する方法
どうしても Global Scope を外したい場所が出てきた時は次のようにするとグローバルスコープを外したクエリを作成できます。 グローバルスコープの是非も再検討してくださいね。
1 2 3 4 5 6 7 8 9 |
// remove one global scope Item::withoutGlobalScope('valid') # Item::withoutGlobalScope('valid')->where( ... // remove all global scopes Item::withoutGlobalScopes() // remove some global scopes Item::withoutGlobalScopes(['valid', 'another']) |
スコープクラスを使う方法
Scope クラス を作ります。 そしてデフォルトにしたいスコープをモデルクラスで設定します。 そこそこ手間がかかるので、 ものすごくたくさんあるクラスのうち極めて限られたクラスでしか使用しないのなら、上の方法が手軽で向いていると思います。
Scope クラス を作る
Scope クラス を作ります。 Scope クラスは app/Scopes
ディレクトリ を作成して配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php namespace AppScopes; use IlluminateDatabaseEloquentScope; use IlluminateDatabaseEloquentModel; use IlluminateDatabaseEloquentBuilder; class ValidScope implements Scope { public function apply(Builder $builder, Model $model) { return $builder->where('valid', true); } } |
上のコードを見るとわかるように、 Scope クラス は Scope インターフェース を実装しています。 Scope インターフェース では apply
メソッド が定義されています。
Scope をモデルに設定する
作成したスコープクラスを使ってモデルクラスで Global Scope を設定します。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php namespace App; use AppScopesValidScope; class Item extends Model { protected static function boot() { parent::boot(); static::addGlobalScope(new ValidScope()); } } |
解除する方法
どうしても Global Scope を外したい場所が出てきた時は次のようにするとグローバルスコープを外したクエリを作成できます。 グローバルスコープの是非も再検討してくださいね。
1 2 3 4 5 6 7 8 9 |
// remove one global scope Item::withoutGlobalScope(ValidScope::class) # Item::withoutGlobalScope(ValidScope::class)->where( ... // remove all global scopes Item::withoutGlobalScopes() // remove some global scopes Item::withoutGlobalScopes([ValidScope::class, AnotherScope::class]) |