Quay lại

Eager Loading load() và with() trong Laravel Chuyên mục PHP và Laravel    2023-07-26    755 Lượt xem    108 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Eager Loading  load() và with() trong Laravel

Hôm nay, khi làm việc với một trong các dự án của mình, được xây dựng trên Laravel, mình đã gặp phải tình huống cần lấy dữ liệu của một bảng relationship thông qua một model. Và mình thấy ở đây có hai cách tiếp cận trong Laravel để thực hiện điều này, về cơ bản được gọi là Eager Loading:

Cả hai đều đưa  ra kết quả cuối cùng giống nhau — Trên thực tế, cả hai đều chạy chính xác hai query giống nhau. Sự khác biệt chính là với with() Eager sẽ load related model trước, ngay sau initial query (ví dụ: all()first(), or find(x); Còn khi sử dụng load(), trước tiên nó sẽ chạy initial query trước, sau đó Eager mới Load related model vào một thời điểm sau đó.

“Eager” ở đây có nghĩa là chúng ta đang liên kết tất cả các related models cho một tập hợp kết quả cụ thể chỉ bằng một câu query, thay vì phải chạy n truy vấn.

Eager loading sử dụng with()

Ví dụ: nếu chúng ta sử dụng Eager Loading bằng with():

$users = User::with('comments')->get();

nếu chúng ta có 5 người dùng, hai truy vấn sau sẽ được chạy ngay lập tức:

select * from `users`
select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5)

…và chúng ta sẽ kết thúc với một collection của models có các 'comments' được đính kèm với user model, vì vậy chúng ta có thể thực hiện điều gì đó như $users->comments->first()->body.

“Lazy” Eager loading sử dụng load()

Theo cách tiếp cận này, trước tiên chúng ta có thể tách thành hai query bằng cách lấy kết quả ban đầu:

$users = User::all();

Đoạn code bên trên sẽ chạy:

select * from `users`

Và sau lệnh trên, nếu chúng ta mà còn thêm một số điều kiện nữa mới muốn lấy ra related comments cho tất cả users thì chúng ta có thể sử dụng Eager load để thực thi điều này :

if($someCondition){
  $users = $users->load('comments');
}

Nó sẽ chạy truy vấn thứ 2:

select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5)

Và chúng ta sẽ có một kết quả tương tự, cũng là chia thành hai bước để query. Một lần nữa, chúng ta có thể gọi $users->comments->first()->body để đến related model cho bất kỳ item nào.

Kết luận

Khi nào sử dụng load() hoặc with()?

load() cung cấp cho bạn tùy chọn quyết định sau, dựa trên một số điều kiện động, cho dù bạn có cần chạy truy vấn thứ 2 hay không.

Nếu bạn cần truy cập vào tất cả các related model, hãy sử dụng with().

 
 
 
 

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