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ệ đó.
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 hasOne
và belongsTo
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:
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à:
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 one
và one 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_at
và updated_at
thì:
Ở 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:
Quick Links
Social Media