端くれプログラマの備忘録 Laravel [Laravel] Polymorphic Relationsの使いどころ

[Laravel] Polymorphic Relationsの使いどころ

Laravelのポリモーフィックリレーション(Polymorphic Relations)は、1つのモデルが複数の他のモデルと動的にリレーションを持つための仕組みを提供します。これにより、同じモデルが異なるタイプのモデルと一対多または多対多の関係を持つことが可能になります。

ポリモーフィックリレーションの例

典型的な例として「コメント」機能を考えてみましょう。コメントを投稿できる対象が「投稿記事」 (Post モデル) と「動画」 (Video モデル) の両方である場合に、1つの Comment モデルを使用して両方の対象にコメントを付けることができます。この場合、Comment モデルは PostVideo のいずれともポリモーフィックリレーションを持つことができます。

実装手順

1. マイグレーションの設定
comments テーブルにポリモーフィックリレーションをサポートするためのカラムを追加します。

   Schema::create('comments', function (Blueprint $table) {
       $table->id();
       $table->text('content');
       $table->morphs('commentable'); // これで `commentable_id` と `commentable_type` カラムが作成される
       $table->timestamps();
   });
  • commentable_id: 関連するモデルのID
  • commentable_type: 関連するモデルのクラス名

2. モデルの設定

  • Comment モデル:
use Illuminate\Database\Eloquent\Model;

class Comment extends Model { 
    public function commentable() {
        return $this->morphTo();
    } 
}
  • PostVideo モデル:
use Illuminate\Database\Eloquent\Model;

class Post extends Model {
    public function comments() {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

class Video extends Model {
    public function comments() {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

使用例

以下は、Post モデルにコメントを追加する例です。

$post = Post::find(1);
$post->comments()->create([
    'content' => 'This is a comment on a post.'
]);

$video = Video::find(1);
$video->comments()->create([
    'content' => 'This is a comment on a video.'
]);

まとめ

  • ポリモーフィックリレーションは、1つのリレーションシップを通じて異なるモデルと関連付けを行うための強力な方法です。
  • 例えば、Comment モデルが PostVideo の両方に関連付けられるように、柔軟な構造を提供します。

これにより、異なるタイプのモデルとリレーションを簡単に定義して操作することができます。