Làm chủ Eloquent Relationships trong Laravel
Eloquent relationships định nghĩa cách các model tương tác với nhau. Bằng cách làm chủ relationships, bạn có thể đơn giản hóa các truy vấn phức tạp và làm cho code dễ bảo trì hơn.
One-to-One
Quan hệ one-to-one liên kết một bản ghi trong bảng này với một bản ghi trong bảng khác.
Ví dụ: Một User có một Phone.
class User extends Model {
public function phone() {
return $this->hasOne(Phone::class);
}
}
class Phone extends Model {
public function user() {
return $this->belongsTo(User::class);
}
}
Lấy thông tin phone:
$user = User::find(1);
$phone = $user->phone;
One-to-Many
Quan hệ one-to-many liên kết một bản ghi trong bảng này với nhiều bản ghi trong bảng khác.
Ví dụ: Một Post có nhiều Comments.
class Post extends Model {
public function comments() {
return $this->hasMany(Comment::class);
}
}
class Comment extends Model {
public function post() {
return $this->belongsTo(Post::class);
}
}
Lấy danh sách comments:
$post = Post::find(1);
$comments = $post->comments;
Many-to-Many
Quan hệ many-to-many liên kết nhiều bản ghi trong bảng này với nhiều bản ghi trong bảng khác.
Ví dụ: Một User thuộc về nhiều Roles.
class User extends Model {
public function roles() {
return $this->belongsToMany(Role::class);
}
}
class Role extends Model {
public function users() {
return $this->belongsToMany(User::class);
}
}
Lấy danh sách roles:
$user = User::find(1);
$roles = $user->roles;
Polymorphic Relationships
Quan hệ đa hình cho phép một model thuộc về nhiều model khác trên cùng một liên kết.
Ví dụ: Một Post và một Video có thể chia sẻ cùng Tag.
class Tag extends Model {
public function taggable() {
return $this->morphTo();
}
}
class Post extends Model {
public function tags() {
return $this->morphMany(Tag::class, 'taggable');
}
}
class Video extends Model {
public function tags() {
return $this->morphMany(Tag::class, 'taggable');
}
}
Lấy danh sách tags:
$post = Post::find(1);
$tags = $post->tags;
Many-to-Many Polymorphic Relationships
Quan hệ này cho phép một model thuộc về nhiều model thuộc các loại khác nhau.
Ví dụ: Một Post và một Video có thể chia sẻ cùng Category.
class Category extends Model {
public function categorizables() {
return $this->morphedByMany(Post::class, 'categorizable');
}
}
Các phương pháp tốt nhất
- Sử dụng tên method mô tả rõ ràng: Đặt tên các relationship methods sao cho chỉ rõ mục đích của chúng.
- Eager Load Relationships: Sử dụng
with()để giảm số lượng truy vấn. - Tránh N+1 Queries: Luôn eager load relationships khi lặp qua collections.
- Viết test cho Relationships: Viết tests để đảm bảo relationships được định nghĩa đúng.
Eloquent relationships là một tính năng mạnh mẽ của Laravel. Bằng cách làm chủ chúng, bạn có thể đơn giản hóa các tương tác với database và viết code sạch hơn, dễ bảo trì hơn.