Eager Loading - Kỹ thuật cần biết cho lập trình viên PHP

Giới thiệu

Làm thế nào để tài nguyên hệ thống không bị lãng phí? Phải làm gì để truy vấn dữ liệu được nhanh hơn? Làm sao? Và phải làm như thế nào? 😰 Đó cũng là những câu hỏi chung cho các lập trình viên. Chính vì thế, Eager Loading xuất hiện giúp giải quyết được mọi vấn đề trên. Vậy Eager Loading là gì? Và sử dụng nó như thế nào? Hãy cùng theo dõi bên dưới nhé 👏

Vấn đề

  • Eager Loading là gì?
  • Eager Loading Multiple Relationships là gì?
  • Nested Eager Loading là gì?
  • Eager Loading Specific Columns là gì

Nội dung

Eager Loading là gì? Eager Loading là kĩ thuật để giải quyết bài toán N+1. Nghe có vẻ khó hiểu nhỉ =))). Sau đây mình sẽ làm một ví dụ để mọi người có thể hiểu rõ hơn về Eager Loading nhé. Ví dụ: Giả sử chúng ta có hai bảng là users và comments. Bài toán được đặt ra là : Hãy lấy ra từng user gồm có id, full_name,... và các comment mà user đã viết? Bài toán có vẻ khá đơn giản nhưng... Bắt đầu nào =))) Chắc hẳn đây là cách mà các bạn vẫn thường làm:

Nhìn có vẻ khá ổn nhưng bạn có biết nó sẽ truy vấn như thế này

select * from users

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

Nó sẽ chọn ra tất cà danh sách user của bạn, sau đó nó sẽ so sánh lần lượt với danh sách các comment rồi mới trả kết quả về. Cái này thì đúng N+1 rồi 😵 Thử tưởng tượng mà xem bạn có trên 1000 users. Vậy sẽ là 1001 truy vấn, lúc này thì đúng là có vấn đề lớn rồi. Tuy nhiên với Eager Loading:

Và chỉ 2 câu truy vấn bạn đã lấy được comment của user rồi Và chả có lý do gì mà kể từ bây giờ bạn không dùng Eager Loading cả đúng không nào! Eager Loading Multiple Relationships Vậy Eager Loading có thể dùng cho nhiều quan hệ không? Câu trả lời là có nhé ahihi! Bạn có thể dùng Eager Loading cho tất cả các quan hệ trong project của bạn. Tuy nhiên không nên dùng quá nhiều trong cùng dòng code không thì phồng code đấy =))

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

Có thể viết ngắn gọn hơn:

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

Nested Eager Loading Đến đây chắc các bạn đã hiểu và có thể sử dụng Eager Loading rồi đúng không ??? Một tình huống nữa được đặt ra: Mình có 3 bảng: users, plan và gallery. Như ví dụ trên các bạn có thể dùng Eager Loading để lấy ra được các thuộc tính của bảng plan ứng với mỗi user rồi đúng không nào!

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

Vậy muốn lấy ra hình ảnh trong bảng gallery ứng với mỗi plan và user thì làm như thế nào? Các bạn có thể làm như sau:

Eager Loading Specific Columns Không phải lúc nào cũng phải truy vấn đến tất cả các cột trong bảng đúng không nào. Đơn giản khi truy vấn đến bảng users, bạn chỉ muốn lấy ra id, full_name hay thậm chí là avatar chẳng hạn. Lúc này, Eager Loading Specific Columns phát huy tác dụng. Nó sẽ chỉ lấy ra các cột mà bạn mong muốn. Điều này giúp tài nguyên hệ thống không bị lãng phí và cải thiện tốc độ nữa đấy.

$users = Comment::with('user:id,full_name')->get();

Kết luận

Eager Loading thực sự cần thiết cho các dự án Laravel, hy vọng mọi người thấy hứng thú với bài viết này của mình. Cảm ơn mọi người rất nhiều !!! 👋