Bộ luật
Nói rằng tôi có hai mô hình, tên Product
và Image
, được liên kết bởi Product hasMany Image
và Image belongsTo Product
.Sử dụng giới hạn() trên mô hình chứa
Bây giờ, giả sử tôi muốn tìm nạp tất cả các sản phẩm có hình ảnh đầu tiên. Tôi sẽ sử dụng mã này:
$this->Products->find('all')
->contain([
'Images' => function($q) {
return $q
->order('created ASC')
->limit(1);
}
]);
Có vẻ đúng, phải không? Ngoại trừ bây giờ chỉ có một sản phẩm chứa hình ảnh, mặc dù thực tế mỗi sản phẩm chứa ít nhất một hình ảnh (nếu được truy vấn không có giới hạn).
Các kết quả truy vấn
Vấn đề có vẻ là với giới hạn, vì đây tạo ra hai truy vấn sau đây (ví dụ):
SELECT
Products.id AS `Products__id`,
FROM
products Products
và
SELECT
Images.id AS `Images__id`,
Images.product_id AS `Images__product_id`,
Images.created AS `Images__created`
FROM
images Images
WHERE
Images.product_id in (1,2,3,4,5)
ORDER BY
created ASC
LIMIT 1
Nhìn vào truy vấn thứ hai, nó là khá rõ ràng như thế nào điều này sẽ luôn luôn dẫn đến chỉ có một hình ảnh.
Vấn đề
Tuy nhiên, tôi dự kiến sẽ có các bánh ORM để hạn chế những hình ảnh tới 1 cho mỗi sản phẩm khi tôi gọi limit(1)
.
Câu hỏi của tôi: Đây có phải là lỗi trong cách tôi sử dụng ORM không? Nếu có, cách nên Tôi giới hạn số lượng hình ảnh là một hình ảnh như thế nào?
Để tham khảo trong tương lai: Tôi đã kết thúc chỉ đơn giản là bỏ qua 'limit()' và chỉ sử dụng hình ảnh đầu tiên trong mảng. Tất cả các câu trả lời, trong khi làm việc, có vẻ như một cách giải quyết. Bánh ORM ** luôn ** sử dụng một truy vấn đơn chứa, ngay cả khi điều này là không mong muốn (như khi thêm giới hạn truy vấn). –