はじめに
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();
よみやすい!!
おわりに
実際はもっといろいろな条件が入り混じって大変読みづらいものが、スコープ名から一発でわかるようになるのはとても楽