Laravelのポリモーフィックリレーション(Polymorphic Relations)は、1つのモデルが複数の他のモデルと動的にリレーションを持つための仕組みを提供します。これにより、同じモデルが異なるタイプのモデルと一対多または多対多の関係を持つことが可能になります。
ポリモーフィックリレーションの例
典型的な例として「コメント」機能を考えてみましょう。コメントを投稿できる対象が「投稿記事」 (Post
モデル) と「動画」 (Video
モデル) の両方である場合に、1つの Comment
モデルを使用して両方の対象にコメントを付けることができます。この場合、Comment
モデルは Post
や Video
のいずれともポリモーフィックリレーションを持つことができます。
実装手順
1. マイグレーションの設定comments
テーブルにポリモーフィックリレーションをサポートするためのカラムを追加します。
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->text('content');
$table->morphs('commentable'); // これで `commentable_id` と `commentable_type` カラムが作成される
$table->timestamps();
});
commentable_id
: 関連するモデルのIDcommentable_type
: 関連するモデルのクラス名
2. モデルの設定
Comment
モデル:
use Illuminate\Database\Eloquent\Model;
class Comment extends Model {
public function commentable() {
return $this->morphTo();
}
}
Post
とVideo
モデル:
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
モデルがPost
とVideo
の両方に関連付けられるように、柔軟な構造を提供します。
これにより、異なるタイプのモデルとリレーションを簡単に定義して操作することができます。