Der Kodex
Sagen, ich habe zwei Modelle, genannt Product
und Image
, die von Product hasMany Image
und Image belongsTo Product
verbunden ist.Mit limit() auf enthaltenes Modell
Nun sagen, ich möchte alle Produkte mit dem ersten Bild jeweils abrufen. Ich würde diesen Code verwenden:
$this->Products->find('all')
->contain([
'Images' => function($q) {
return $q
->order('created ASC')
->limit(1);
}
]);
Sieht nach rechts, oder? Außer jetzt nur ein der Produkte enthält ein Bild, obwohl jedes Produkt tatsächlich mindestens ein Bild enthält (wenn ohne das Limit abgefragt).
Die resultierende Abfrage
Das Problem mit der Grenze zu sein scheint, da dies die folgenden zwei Abfragen (zum Beispiel) erzeugt:
bei derSELECT
Products.id AS `Products__id`,
FROM
products Products
und
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
Suche zweite Frage, es ist ziemlich offensichtlich, wie dies immer nur ein Bild ergeben wird.
Das Problem
Allerdings würde ich den Kuchen ORM haben erwartet die Bilder auf 1 pro Produkt zu begrenzen, wenn ich limit(1)
genannt.
Meine Frage: Ist das ein Fehler bei der Verwendung des ORM? Wenn ja, wie sollte ich die Anzahl der Bilder auf eins pro Bild begrenzen?
Für die Zukunft: Ich habe einfach das Weglassen endete 'limit()' und verwende einfach das erste Bild im Array. Alle Antworten während der Arbeit scheinen eine Umgehungslösung zu sein. Das Cake-ORM ** immer ** verwendet eine einzige Abfrage für contains, auch wenn dies unerwünscht ist (etwa wenn der Abfrage ein Limit hinzugefügt wird). –