Cách tạo relationship trong Laravel: One-to-Many, Many-to-Many

Khi xây dựng các ứng dụng web thực tế, dữ liệu không bao giờ đứng độc lập mà luôn có sự liên kết chặt chẽ với nhau (ví dụ: một danh mục chứa nhiều sản phẩm, một bài viết có nhiều thẻ tag). Trong thế giới Laravel, Eloquent ORM cung cấp một hệ thống quản lý mối quan hệ (Relationships) cực kỳ mạnh mẽ và trực quan. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về cách tạo relationship trong Laravel với các mô hình One-to-Many và Many-to-Many chuẩn chỉnh nhất.

1. Mối quan hệ One-to-Many (Một – Nhiều)

Mối quan hệ One-to-Many dùng để mô tả trường hợp một bản ghi ở bảng A có thể liên kết với nhiều bản ghi ở bảng B.

Ví dụ thực tế: Một Danh mục (Category) có thể chứa nhiều Sản phẩm (Product), nhưng ngược lại mỗi sản phẩm chỉ thuộc về một danh mục duy nhất.

Bước 1: Thiết lập Migration cơ sở dữ liệu

Để liên kết hai bảng, bảng “nhiều” (bảng products) cần phải có một cột khóa ngoại (foreign key) trỏ về khóa chính của bảng “một” (bảng categories).

READ  Cách upload file trong Laravel lưu trữ an toàn, đúng chuẩn

Trong file migration của bảng products, bạn thêm cột category_id:

PHP

Schema::create(‘products’, function (Blueprint $table) {

    $table->id();

    $table->foreignId(‘category_id’)->constrained()->onDelete(‘cascade’); // Khóa ngoại

    $table->string(‘name’);

    $table->decimal(‘price’, 10, 2);

    $table->timestamps();

});

Bước 2: Định nghĩa Relationship trong Model

Bây giờ, bạn cần khai báo mối quan hệ này bên trong các lớp Model tương ứng.

  • Trong Model Category (Mối quan hệ hasMany):

PHP

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\Relations\HasMany;

class Category extends Model

{

    public function products(): HasMany

    {

        return $this->hasMany(Product::class);

    }

}

  • Trong Model Product (Mối quan hệ belongsTo):

PHP

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Product extends Model

{

    public function category(): BelongsTo

    {

        return $this->belongsTo(Category::class);

    }

}

Bước 3: Cách sử dụng thực tế

Sau khi đã thiết lập xong, bạn có thể dễ dàng truy vấn dữ liệu tương ứng:

  • Lấy tất cả sản phẩm thuộc về một danh mục có ID bằng 1:

PHP

$category = Category::find(1);

$products = $category->products; // Trả về một Collection các Product

  • Lấy thông tin danh mục của một sản phẩm cụ thể:

PHP

$product = Product::find(1);

$category = $product->category; // Trả về đối tượng Category tương ứng

Nếu bạn đã nắm vững các thao tác thủ thuật cơ bản, thì việc thiết lập các liên kết bảng sẽ là bước tiến quan trọng tiếp theo giúp tối ưu hóa mô hình dữ liệu của bạn.

2. Mối quan hệ Many-to-Many (Nhiều – Nhiều)

Mối quan hệ Many-to-Many phức tạp hơn một chút, dùng khi nhiều bản ghi ở bảng A có thể liên kết với nhiều bản ghi ở bảng B.

READ  Bảo Mật Laravel Dễ Dàng Với Ẩn Config Quan Trọng Hiệu Quả

Ví dụ thực tế: Một Bài viết (Post) có thể có nhiều Thẻ Tag (Tag), và ngược lại một Thẻ Tag cũng có thể được gắn cho nhiều Bài viết khác nhau.

Bước 1: Tạo bảng trung gian (Pivot Table)

Để quản lý mối quan hệ này, bạn cần một bảng trung gian thường được đặt tên theo quy tắc gộp tên hai bảng theo bảng chữ cái (ví dụ: bảng post_tag). Bảng này chứa ít nhất hai cột khóa ngoại: post_idtag_id.

PHP

Schema::create(‘post_tag’, function (Blueprint $table) {

    $table->id();

    $table->foreignId(‘post_id’)->constrained()->onDelete(‘cascade’);

    $table->foreignId(‘tag_id’)->constrained()->onDelete(‘cascade’);

});

Bước 2: Định nghĩa Relationship trong Model

Sử dụng phương thức belongsToMany cho cả hai Model.

  • Trong Model Post:

PHP

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\Relations\BelongsToMany;

 

class Post extends Model

{

    public function tags(): BelongsToMany

    {

        return $this->belongsToMany(Tag::class);

    }

}

  • Trong Model Tag:

PHP

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\Relations\BelongsToMany;

 

class Tag extends Model

{

    public function posts(): BelongsToMany

    {

        return $this->belongsToMany(Post::class);

    }

}

Bước 3: Cách sử dụng và thao tác dữ liệu

  • Lấy danh sách các tag của một bài viết:

PHP

$post = Post::find(1);

foreach ($post->tags as $tag) {

    echo $tag->name;

}

  • Gắn (Attach) một hoặc nhiều tag mới cho bài viết:

PHP

$post = Post::find(1);

$post->tags()->attach([2, 3]); // Gắn các tag có ID là 2 và 3 vào bài viết

  • Gỡ bỏ (Detach) hoặc đồng bộ (Sync) lại danh sách tag:

PHP

$post->tags()->detach(2); // Gỡ bỏ tag ID 2

$post->tags()->sync([1, 4]); // Đồng bộ: chỉ giữ lại tag 1 và 4, xóa các liên kết cũ khác

Lời kết

Việc nắm vững và sử dụng thành thạo các mối quan hệ One-to-Many và Many-to-Many trong Eloquent ORM sẽ giúp mã nguồn của bạn trở nên ngắn gọn, tối ưu và dễ bảo trì hơn rất nhiều so với việc viết câu lệnh SQL thủ công. Để tiếp tục hoàn thiện kỹ năng lập trình backend, tối ưu hóa hiệu năng ứng dụng và cập nhật thêm nhiều mô hình kiến trúc chuyên sâu khác, bạn có thể tham khảo Học Laravel để đón đọc những bài viết mới nhất mỗi ngày.

READ  Cách phân quyền Laravel với Middleware và Spatie Permission

 

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *