Trang chủTác giảLiên hệ

Eloquent: Relationships

By Nguyễn Bảo Trung
Published in Laravel
June 09, 2021
2 min read

Trong cơ sở dữ liệu, các bảng thường có quan hệ với các bảng khác. Eloquent cũng cung cấp cho chung ta những công cụ để quản lý và làm việc với những quan hệ này một cách đơn giản. Trong bài viết này chúng ta sẽ cùng nhau đi tìm hiểu về những quan hệ đó.

Định nghĩa Relationships

One to one

Quan hệ 1-1 là một quan hệ đơn giản nhất giữa các table với nhau. Ví dụ như một bài post sẽ chỉ có duy nhất 1 ảnh đại diện post_image và ngược lại thì 1 post_image cũng chỉ thuộc về duy nhất 1 bài post. Hay 1 ví dụ thường gặp nữa là 1 đơn đặt hàng order sẽ chỉ có duy nhất 1 chi tiết đơn hàng order_detail và ngược lại thì 1 order_detail cũng chỉ có duy nhất 1 order. Ta sẽ đi vào ví dụ cụ thể giữa post - post_image để xem cách định nghĩa chúng như thế nào: Trong bảng post_images chúng ta cần có 1 cột khóa ngoại là post_id để xác định ảnh là của bài viết nào. Để định nghĩa quan hệ giữa post - post_image: Trong model Post ta sử dụng phương thức hasOne:

Còn bên model PostImage ta sử dụng phương thức belongsTo:

Để ý 1 chút thì ta sẽ thấy tham số truyền vào hasOnebelongsTo chính là tên của Model liên quan. Khi mà quan hệ đã được định nghĩa, ta có thể truy cập vào nó như một thuộc tính được định nghĩa trong model:

Trong trường hợp mà khóa ngoại ở bảng post_images không phải là post_id thì bạn có thể truyền nó vào làm tham số thứ 2 như sau:

One to Many

Quan hệ 1-n là quan hệ mà 1 record ở table này sẽ có nhiều record ở table khác. Ví dụ như trường hợp 1 người dùng user thì có thế có nhiều bài đăng post, nhưng 1 post thì chỉ thuộc về duy nhất 1 user. Cách khai báo cũng gần giống như one to one. Trong model User:

Trong model Post:

Và cách truy xuất tới các quan hệ cũng tương tự là:

Many to Many

Mức độ phức tạp của quan hệ này sẽ là cao hơn sơ với 2 quan hệ trước là one to oneone to many. Cụ thể một ví dụ là: Một bài viết post sẽ có được gắn nhiều nhãn tag và 1 tag cũng sẽ được gắn cho nhiều bài viết. Để định nghĩa quan hệ này trong laravel, ngoài 2 bảng ban đầu là posts và tags thì cần thêm một bảng trung gian là post_tag với 2 column là post_id và tag_id. Phương thức belongsToMany được cung cấp để định nghĩa quan hệ này trong Model.

Vẫn như các phương thức hasOne, hasMany, belongsTo tham số đầu tiên truyền vào belongsToMany là tên của Model liên quan. Còn tham số thứ 2 có khác 1 chút là tên của table trung gian post_tag. Bây giờ, để truy xuất dữ liệu quan hệ này, cũng rất đơn giản, tương tự như 2 quan hệ trên:

Ngoài ra nếu bạn muốn truy xuất vào bảng trung gian để lấy thông tin, Eloquent cũng cung cấp sẵn cho bạn thuộc tính pivot để thực hiện điều này mà ko cần phải viết lại query.

Nhưng có một chú ý nhỏ ở đây là mặc định thì laravel sẽ hiểu là trung gian sẽ chỉ bao gồm khóa chính của các bảng chính. Nên sẽ chỉ truy xuất được thông tin của những cột này. Nhưng đừng lo vì Eloquent cũng sẽ hỗ trợ bạn, bạn chỉ cần khai báo những cột khác này trong lúc định nghĩa quan hệ:

Và trường hợp riêng là bạn muốn lấy thông tin của created_atupdated_at thì:

Thêm và cập nhập các model liên quan

Ở bài viết trước Eloquent: Getting Started chúng ta đã biết cách làm thế nào để thêm, update một model. Vậy model đó có quan hệ với các model khác, ví du: khi có một bài viết post, để update 1 ảnh đại diện post_image tương ứng, thông thường ta sẽ phải tạo mới 1 instance rồi set các giá trị đặc biết là id của post vừa tạo. Bây giờ, khi đã tạo quan hệ cho 2 table thì bạn có thể gọi trực tiếp phương thức save như sau:


Nguyễn Bảo Trung

Developer

Related Posts

Laravel
Lang thang trong RouteProvider của Laravel 8
July 22, 2021
4 min
© 2021, All Rights Reserved.

Quick Links

Liên hệ quảng cáoThông tinLiên hệ

Social Media