0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ポリモーフィックリレーションでリレーション先のモデルが存在しないものは取得対象外にしたい

Last updated at Posted at 2023-07-26

この記事は移行しました!最新の内容はこちらをご覧ください😀

関連モデルが削除されているデータは取得対象外にしたい。
そんなときあるよねー!

例)

  1. Aさんがコメントしました。
  2. Aさんが記事Xについてコメントしました。
  3. Aさんが記事Yについてコメントしました。
  4. Bさんが記事Xについてコメントしました。
  5. AさんがビデオZについてコメントしました。

コメントの一覧を取得したい。
ただし記事Xが削除されたので、2,4は除く。

->where(function ($query) {
     // そもそも関連モデルのないコメントは取得したい(1のこと)
    $query->whereNull('commentable_id');
     // 関連モデルIDがあり、関連モデルが生きているものを取得(3と5)
    $query->orWhereHasMorph(
        'commentable',
        [Post::class, Video::class],
        function ($query) {
            $query->whereNotNull('commentable_id');
        }
    );
})

余談(commentable_typeに登録する値)

ポリモーフィックタイプはデフォルトでモデル名が登録されるが、

  • 将来的にモデル名(ディレクトリ)が変更されたり
  • CQRSで同じモデルを複数クラス定義する可能性もあるので

文字列定義してそれを使用するのがオススメ。
App\Models\Post ではなく post で登録しておこう的な話)

const.php
    'POLYMORPHIC_TYPE' => [
        'POST' => 'post',
        'VIDEO' => 'video',
    ],
Commentモデル
public function commentable()
{
    Relation::morphMap([
        config('const.POLYMORPHIC_TYPE.POST') => 'App\Services\GetCommentList\Query\Models\Post',
        config('const.POLYMORPHIC_TYPE.VIDEO') => 'App\Services\GetCommentList\Query\Models\Video',
    ]);
    return $this->morphTo();
}
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?