Quay lại

Attach, detach và sync many-to-many relationships trong Laravel Chuyên mục PHP và Laravel    2023-07-28    1.3k Lượt xem    52 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Attach, detach và sync many-to-many relationships trong Laravel

Có bốn loại mối quan hệ được liên kết giữa các models/entities. Và chúng là: One To One, One To Many, Many To One và Many To Many. Chúng ta sẽ nói cụ thể về mối quan hệ Many To Many và quan trọng nhất là attach, detach and sync các helper methods được cung cấp trong Laravel trong bài viết này.

Mối quan hệ “Many to Many” là gì?

A relationship betweeen two entities is called as Many to Many when multiple records in a table are associated with multiple records in another table.

Tạm dịch : Mối quan hệ giữa hai entities ( thực thể ) được gọi là Many to Many khi nhiều bản ghi trong một bảng được liên kết với nhiều bản ghi trong một bảng khác.

Chẳng hạn, giả sử chúng ta có hai entities Books và Authors. Nếu quan sát kỹ mối quan hệ này, bạn sẽ nhận thấy rằng một cuốn books  “can” có nhiều authors  và một authors  “has” viết nhiều books. Trong trường hợp này, bạn có many books related đến many authors.

Vì vậy, nếu chúng ta muốn xác định mối quan hệ giữa hai entities này, chúng ta sẽ cần ba bảng cơ sở dữ liệu: booksauthors và một bảng đặc biệt được gọi là “pivot tablebook_author. Bảng book_author được lấy từ thứ tự bảng chữ cái của các related model names và chứa các cột book_id và author_id.

Và đây là cách chúng ta có thể xác định mối quan hệ trong model Laravel bằng phương thức belongsToMany:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    /**
     * The authors that belong to the book.
     */
    public function authors()
    {
        return $this->belongsToMany('App\Author');
    }
}

Chúng ta có thể xác định model cho Author theo cách tương tự. Bây giờ khi relationship được xác định, bạn có thể truy cập books của tất cả các authors như sau:

$book = App\Book::find(1);

foreach ($book->authors as $author) {
    dd($author->name);
}

Bây giờ, trở lại chủ đề dự định của bài viết này. Laravel đi kèm với các phương thức trợ giúp nhỏ tiện dụng được gọi là attach, detach and sync để thêm một số tiện ích nhất định cho các mối quan hệ Many To Many. Hãy xem xét từng cái một.

Attach method

Helper method cụ thể này có thể được sử dụng để attach một bản ghi entity nhất định vào bản ghi entity khác trong pivot table. Chẳng hạn, trong ví dụ trên, nếu chúng ta muốn attach một author vào một book, chúng ta có thể sử dụng phương thức attach sẽ chèn một bản ghi có liên quan vào bảng pivot/intermediate (pivot/bảng trung gian) table như sau:

$book = App\Book::find(1);

$book->authors()->attach($authorId);

Bạn cũng có thể pass dữ liệu bổ sung trong phương thức attach nếu bạn muốn cập nhật các trường bổ sung trong bảng trung gian.

$book = App\Book::find(1);

$book->authors()->attach($authorId, ['best_seller' => true]);

Detach method

Tương tự, nếu bạn muốn xóa một entity relationship (mối quan hệ thực thể ) nhất định khỏi pivot table, bạn có thể sử dụng phương pháp detach. Chẳng hạn, nếu bạn muốn xóa một tác giả nào đó khỏi một cuốn sách, bạn có thể làm như vậy.

$book->authors()->detach($authorId);

Hoặc bạn có thể pass nhiều ID dưới dạng một mảng.

$book->authors()->detach([4, 5, 8]);

Nếu bạn muốn xóa tất cả các authors khỏi một cuốn book, hãy sử dụng detach mà không pass bất kỳ đối số nào.

$book->authors()->detach();

Sync method

Helper method sync giống như giao điểm của phương thức attach và detach. Vì vậy, về cơ bản, phương pháp này có thể được sử dụng để thiết lập liên kết Many to many. Đó là nó sẽ chỉ giữ liên kết được truyền vào cho nó dưới dạng một mảng như vậy.

$book->authors()->sync([5, 2, 10]);

Bất kỳ ID nào không có trong mảng đã cho sẽ bị xóa khỏi bảng pivot table. Vì vậy, chỉ liên kết còn lại trong bảng tổng hợp sẽ là [5, 2, 10] trong ví dụ trên đối với  books và authors.

Nếu bạn không muốn detach (xóa) các ID hiện có, bạn có thể sử dụng phương thức syncWithoutDetaching:

$book->authors()->syncWithoutDetaching([1, 2, 3]);
 
 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday