Khi bạn chạy lệnh User::all(), Laravel không chỉ đơn giản là trả về dữ liệu từ Database. Có một quá trình phức tạp diễn ra ngầm gọi là Hydration. Hiểu rõ quá trình này sẽ giúp bạn giải thích tại sao Eloquent đôi khi lại “ngốn” RAM và làm thế nào để tối ưu hóa nó.
#1. Hydration là gì?
“Hydrate” (nghĩa đen là làm cho đủ nước) trong lập trình là quá trình đổ dữ liệu từ một nguồn lưu trữ (như kết quả SQL thô) vào một đối tượng (Object) trong bộ nhớ.
Với Laravel, đó là khi Framework lấy một mảng các giá trị từ PDO và tạo ra các instance của class User, gán các giá trị đó vào mảng $attributes nội bộ của Model.
#2. Quy trình 4 bước của Hydration
- Query Execution: Query Builder thực thi câu lệnh SQL qua PDO và nhận về một mảng các
stdClasshoặc mảng thô. - Instance Creation: Với mỗi hàng dữ liệu, Laravel khởi tạo một object Model mới (ví dụ:
new User). - Attribute Filling: Laravel đổ dữ liệu thô vào mảng
$attributesvà đồng thời lưu một bản sao vào mảng$original(để phục vụ việc kiểm tra thay đổi sau này). - Booting & Events: Laravel gọi phương thức
boot()của Model và bắn ra eventretrieved.
#3. Tại sao Hydration lại đắt đỏ?
Nếu bạn lấy ra 10.000 hàng dữ liệu:
- Laravel phải khởi tạo 10.000 object.
- Mỗi object lại tốn bộ nhớ cho các mảng
$attributes,$original,$relations,$casts… Đây chính là lý do tại sao dùngUser::all()trên một bảng lớn thường gây lỗi Out of Memory.
#4.Câu hỏi nhanh
Câu hỏi: Làm thế nào để bỏ qua bước Hydration khi bạn cần xử lý hàng triệu bản ghi trong Laravel?
Trả lời:
Sử dụng Query Builder thay vì Eloquent.
Thay vì: User::all(), hãy dùng DB::table('users')->get().
- Query Builder chỉ trả về các mảng thô hoặc
stdClassđơn giản. Nó không tốn chi phí khởi tạo Model, không có Observers, không có Accessors/Mutators. Hiệu năng sẽ nhanh hơn gấp nhiều lần và tiết kiệm RAM đáng kể.
Câu hỏi mẹo: Accessors (getFooAttribute) được thực thi ở giai đoạn nào của Hydration?
Trả lời: Không phải ở giai đoạn Hydration. Accessors chỉ được thực thi tại runtime khi bạn thực sự truy cập vào thuộc tính đó (ví dụ: $user->full_name). Dữ liệu thô trong $attributes vẫn được giữ nguyên bản.
#5. Kết luận
Eloquent cực kỳ mạnh mẽ nhờ Hydration, nhưng cái giá phải trả là hiệu năng. Một Senior Developer giỏi là người biết khi nào nên tận dụng sự tiện lợi của Eloquent và khi nào nên quay về với Query Builder thuần túy để bảo vệ tài nguyên hệ thống.