LoginSignup
5
2

More than 3 years have passed since last update.

LaravelのwhereHasでの条件指定でクエリスコープが使える

Posted at

はじめに

Controller内での条件指定が複雑になり読みにくくなってしまったので、勢いで試してみたらできたのでそのメモです
(検証環境はver6.4)

やってみた

前提として公式のドキュメントあるあるのブログシステムで関連した多くのPostモデルを持つUserモデルでやってみる
(下記みたいなやつ)

\App\User.php
/**
 * ユーザーの全ポストの取得
 */
public function posts()
{
    return $this->hasMany('App\Post');
}

よくあるパターン

下書きの記事(post.status=0)があるユーザーであるか
\App\User::find(1)->whereHas('post', function (Builder $query) {
    $query->where('status', 0);
})->exists();

post.status = 0ってなんだ?っとなり可読性がよろしくない
POST::DRAFT みたいに定数化したら読みやすいが余計な依存関係ができて微妙・・・

スコープを使ってみる

事前にPostモデルにスコープを定義しておいて、呼び出してみると同じように絞り込みができる

\App\Post.php
public function scopeDraft(Builder $query): Builder
{
    return $query->where('status', 0);
}
下書きの記事があるユーザーであるか
\App\User::find(1)->whereHas('post', function (Builder $query) {
    $query->draft();
})->exists();

よみやすい!!

おわりに

実際はもっといろいろな条件が入り混じって大変読みづらいものが、スコープ名から一発でわかるようになるのはとても楽

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2