Laravelのスコープを利用して、Eloquentの処理を簡略化する方法

Laravelにスコープ(scope)という機能があります。
モデルを拡張する機能です。

使用用途は、特定のモデルで繰り返し発生しうる処理に対して、
モデル内でスコープを定義することで、スコープを呼び出すだけで済みます。

例えば、下記のようにPostモデルに対して、公開中の処理が下記の2つのwhere句を必要としましょう。毎回、公開中であるたびに、記述しているのはかなり面倒くさい。

Post::where(‘is_draft’, 0)
 ->where(‘isClosed’, 0) 

こういう、いろんなところで書きそうな条件はスコープにしてしまえば、書き間違えや書き漏れがなくなります。
https://readouble.com/laravel/7.x/ja/eloquent.html#query-scopes

ModelのPost.php の中で

    public function scopePublish($query)
{
return $query->where('is_draft', 0)
  ->where('isClosed', 0);
}
  • eloquentクラスに scopeXxxxxxでメソッドつくるとローカルスコープを作れる
  • そこに条件を書いておく

そうすると、呼び出し元では、

// 変更前
$searchArticles =  Post::where('is_draft', 0)
            ->where('isClosed', 0)
            ->where('lovesex' , $request->lovesex)// 変更後(スコープを利用)
$searchArticles =  Post::publish()
            ->where('lovesex' , $request->lovesex)
  • eloquentクラスに書いた scopeXxxxxxメソッドの Xxxxx 部分で呼び出し可能になる
// is_draft が0、かつ isClosed が0のデータ
RecomendArticle::where('is_draft', 0)
            ->where('isClosed', 0)

って読みづらかったものが

// 公開中のもの
Post::publish();

と無駄な記述も減らすことが可能です。