Giới thiệu về MorphTo trong Laravel
Khái niệm
MorphTo là một quan hệ đa hình (polymorphic relationship) trong Eloquent, cho phép một model "thuộc về" nhiều loại model khác nhau thông qua một cột chung.
Khi nào dùng?
- Khi một thực thể liên kết linh hoạt với nhiều thực thể khác (ví dụ:
Comment
thuộc vềPost
hoặcVideo
). - Tiết kiệm bảng và tái sử dụng code.
Cấu trúc bảng
Cần 2 cột:
xxx_type
: Lưu tên model (ví dụ:App\Models\Post
).xxx_id
: Lưu ID của model liên kết.
Ví dụ migration:
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->text('content');
$table->morphs('commentable'); // Tạo commentable_id và commentable_type
$table->timestamps();
});
Thiết lập Model
class Comment extends Model {
public function commentable() {
return $this->morphTo();
}
}
class Post extends Model {
public function comments() {
return $this->morphMany(Comment::class, 'commentable');
}
}
Cách dùng
$comment = Comment::find(1);
$parent = $comment->commentable; // Trả về Post hoặc Video
Ưu điểm
- Linh hoạt, dễ mở rộng.
- Giảm số lượng bảng.
Nhược điểm
- Hiệu suất có thể giảm với dữ liệu lớn.
MorphTo rất hữu ích trong các dự án cần quan hệ đa năng như bình luận, lượt thích, hoặc thông báo.
All rights reserved