ORM – Object Relational Mapping
- Tháng Tư 16, 2021
- Posted by: codestar
- Category: Uncategorized
Không có phản hồi
Khi chúng ta làm việc với Laravel, có một khái niệm mà chúng ta luôn được nhắc tới rất kỹ, đó là ORM trong laravel. Thông thường khi tổ chức dữ liệu, mỗi Table trong DB sẽ có một Model tương ứng trong source code. Và chúng ta có thể thực hiện các thao tác CRUD một cách dễ dàng, không phải viết các thao tác lặp đi lặp lại quá nhiều.
Tuy nhiên nhiều người cho rằng ORM chỉ đơn giản là thay thế câu lệnh SQL cho ngắn gọn, thì điều này đúng nhưng chưa đủ. ORM có theo một số concept mà khi chúng ta làm việc với nó lâu hơn, chúng ta sẽ nhận thấy.
- Khai báo liên kết phụ thuộc: Trong SQL, mỗi khi cần tương tác với dữ liệu trong các bảng khác, chúng ta cần sử dụng “JOIN”. Tuy nhiên việc lặp đi lặp lại JOIN sẽ làm cho câu query trở nên rối rắm hơn, đặc biệt với những dữ liệu liên kết tới 4-5 bảng. Bằng việc khai báo các thành phần liên kết sẵn, chúng ta sẽ gọi câu query bằng việc nhắc lại có lấy phần phụ thuộc hay không, không cần phải viết rất nhiều câu JOIN khó khăn khi debug.
- Query theo object trung tâm: Ok, vấn đề này nghe có vẻ hơi lạ, nhưng cũng không lạ lắm (thậm chí có thể diễn ra hằng ngày tại dự án đang làm của các bạn). Chúng ta có rất nhiều cách để lấy được dữ liệu. Nhưng khi dùng SQL, chúng ta có xu hướng query từ danh sách nhiều đối tượng liên kết với 1 danh sách ít đối tượng. Tuy nhiên với ORM thì điều này là không nên.
Với ORM đặt object làm trung tâm, thì chúng ta sẽ cần query theo object trung tâm đó, tất cả những thành phần khác sẽ được kết nối tới object trung tâm này tạo thành object relation mapper (ORM). Khi các bạn muốn query list câu hỏi trong một đề thi. Thì các bạn query thế nào ? Với ORM, thì khuyến cáo là các bạn query theo đề thi trong đề thi lấy ra các câu hỏi. - Sử dụng scope tối giản where. Trong Laravel, có một tính năng rất đặc biệt, đó là scope. Scope có thể hiểu là một vài điều kiện where, được nhóm lại thành 1 phạm vi (scope) nhỏ của dữ liệu trong bảng và đặt 1 cái tên dễ hiểu. graduatedStudent() có dễ hiểu hơn là where(‘status’, 2) không ?
- Tối đa hóa eager loading. Laravel có một tính năng được gọi là eager loading giúp cho việc query các đối tượng lồng nhau được tiết kiệm hơn. Về cơ bản, muốn xem chi tiết số câu hỏi của 10 đề thi, liệu chúng ta có phải query 10 lần ? Tất nhiên là không với eager loading. (Nhưng nếu không dùng eager loading thì có thể phải query 10 lần thật). Chúng ta chỉ việc thêm từ khóa with() để định rõ chúng ta sẽ lấy các thành phần phụ thuộc của object trung tâm. Multiple eager loading hay nested eager loading đều sẽ không phải là vấn đề.
Và đó là một vài điểm đặc biệt khi sử dụng ORM, còn nhiều tính năng nữa, mà có lẽ chúng ta sẽ được tham khảo trong các bài khác.
Tác giả: Cao Văn Thành