#1. Vấn đề
Nhiều dev dùng User::all() một cách vô tội vạ, dẫn đến lỗi OOM (Out of Memory) trên các bảng dữ liệu lớn. Bạn cần hiểu tại sao Eloquent lại “ngốn” RAM.
#2. Định nghĩa & Cơ chế
- Builder:
Illuminate\Database\Query\Builder(SQL thuần) vsEloquent\Builder(Wrapper). - Hydration: Quá trình biến mảng dữ liệu từ Database thành Instance của Model.
- Quy trình:
- Executing SQL via PDO.
- Tạo Model Instance (
new User). - Đổ dữ liệu vào mảng
$attributes. - Kích hoạt Event
retrieved.
#3. Cách giải quyết tối ưu
- Query Builder: Dùng
DB::table()khi không cần tính năng Model (Accessors, Events). - Chunk/Cursor: Xử lý hàng triệu record bằng
chunk()(load từng phần) hoặccursor()(dùng Generator load từng dòng).
#4. Mẹo phỏng vấn
- Q: Tại sao
update()trên Builder không chạy Observers? - A: Vì
update()chạy SQL trực tiếp xuống DB, bỏ qua bước Hydration (không khởi tạo model) nên Observers không có instance để chạy. - Q:
withCountxử lý N+1 thế nào? - A: Nó thêm subquery vào câu SELECT chính, tránh phải query thêm bảng quan hệ.
#5. Kết luận
Eloquent là công cụ tuyệt vời nhưng không phải là “viên đạn bạc”. Một Architect cần biết lúc nào nên hy sinh sự tiện lợi của ORM để đổi lấy hiệu năng của SQL thô.