【Laravel】モデルから切り離してScopeクラスを作成する
PHPバージョン:7.1.14
Laravelバージョン:5.7.9
前回はグローバルスコープについてでした!
グローバルスコープは汎用的な処理が多いため、
モデルから切り離しScopeクラスとして
独立させると便利です!
Scopeクラスの作成
まずはScopeクラスを作成します!
app>Scopesディレクトリを作成し、
ScopeArticle.phpというファイルを作成します!
<?php namespace App\Scopes; use Illuminate\Database\Eloquent\Scope; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use Carbon\Carbon; class ScopeArticle implements Scope { public function apply(Builder $builder, Model $model) { $builder->where('updated_at', '>', Carbon::now()->subYear(3)); } }
app>Scopes?ScopeArticle.php
implementsにより、Scopeを継承します。
Scopeを使うためuse宣言もします。
Scopeインターフェイスとして定義されているapplyメソッドを使います。
やっていることは、グローバルスコープの記事内容と全く同じです。
「updated_at(最終更新日)が現在より3年前の記事は表示しない。」
という内容のスコープを定義しました。
CarbonはLaravel標準搭載の日付を管理するクラスです。
Carbon::now()->subYear(3)
で、「現在から三年を引いた日」となります。
モデルでScopeクラスを適用
Articleモデルにて、ArticleScopeクラスを適用していきます。
<?php namespace App\Models; use App\Scopes\ScopeArticle; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class Article extends Model { protected $guarded = ['id']; protected static function boot() { parent::boot(); static::addGlobalScope(new ScopeArticle); } }
app>Models>Article.php
グローバルスコープの記事に使った
"addGlobalScope"メソッドの引数として、
先ほど作成したScopeArticleクラスをnewしています。
"App\Scopes\ScopeArticle"のuse宣言も忘れずに。
以上でScopeクラスのモデルへの適用完了です。
今回はここまでです、ありがとうございました〜!