Criteria Association mit setLimit liefert weniger Elemente als erwartet?

Hallo zusammen,

ich habe eine Kategorie, der sechs Produkte zugeordnet sind.

Ich habe ein Criteria, das diese Kategorie sowie die products-Association ausliest, mit Ausnahme einer Produkt-ID:

$criteria = new Criteria($categoryId);
$criteria
    ->addAssociation('products');

$criteria->getAssociation('products')
    ->addFilter(new NotFilter(NotFilter::CONNECTION_AND, [new EqualsFilter('id', $productId)));

(Beispiel-Code ungetestet)

So weit, so gut, und ich erhalte die Kategorie mit fünf von sechs der zugeordneten Produkte.

Jetzt möchte ich die Produkte einschränken, so dass ich nur vier erhalte:

$criteria->getAssociation('products')->setLimit(4);

Aber damit erhalte ich nur noch drei von sechs Produkten?

Irgendeine Idee warum?

Ist das der richtige Weg, um die products-Association zu begrenzen?
Oder ist das überhaupt der richtige Weg, um eine bestimmte Produkt-ID in der Association auszuschließen?

Interessanterweise tritt dies nicht bei allen Produkt-Kategorie-Kombinationen auf.

Während ich immer dieselbe Kategorie abrufe, ändert sich die ausgeschlossene Produkt-ID, und für einige erhalte ich vier Produkte in der Association und für andere aber nur drei?

Vielen Dank im Voraus!

Ich weiß, dass es hier „früher“ mal einen unsinnige Defaultwert gab, mittlerweile werden aber immer alle untergeordneten Werte zurückgeliefert.
Vermutlich funktioniert das ->setLimit(4); auf der Association nicht wirklich. In SQL ist das dann ja ein Join. Und der Join selbst hat ja kein Limit sondern „nur“ die finale Ergebnis-Tabelle.

Fragt sich aber warum und in den untergeordneten Association überhaupt ein Limit brauchst ?

Ich habe mir gedacht, dass wir mit dem Limit vermeiden, unnötig mehr Produkte auszulesen, wenn ich nur vier brauche.

Ich könnte das Limit auf 5 setzen.
Dann bekomme ich auch mit diesem „Quirk“ immer mindestens vier Produkte und im Template Rendering begrenze ich das dann auf vier.
Ich fände es aber schöner, wenn ich direkt nur maximal vier bekomme.

Eine andere Lösung wäre, zuerst die CategoryEntity zu holen und dann separat die ProductCollection, anstatt als Association.
Aber wenn es schon dieses nette Association-Feature gibt, dann möchte ich das auch nutzen.

Die Idee ist übrigens folgende:

Wir wollen auf einer Produktdetailseite eine Kategorieseite verlinken, zu der das Produkt zugeordnet ist (plus weitere Konditionen).

Außerdem sollen vier weitere Produkte aus dieser Kategorie vorgestellt werden, außer natürlich dem Produkt, auf dem wir uns gerade befinden.

Das funktioniert alles, aber wie gesagt, mit dem setLimit(4) auf der products-Association bekommen wir manchmal nur drei Produkte.

dann würde ich das eher so machen, dass man zunächst mit „plain SQL“ nur die ids „selected“ und damit dann in den ORM. Hier kannst Du dann einfach das limit verwenden.

Ich hatte das Problem vorher mal, bei einer Order, die dann die OrderItems als Association liefert. Dann waren die Items dann irgendwann nicht vollständig bei „größeren“ Bestellungen. Das Problem ist dann aber, das ja eigentlich das Ganze eine Paginierung ist. Also braucht man halt auch ein skip; nur genau das gibt es hier überhaupt nicht …

Ok, danke für deine Hilfe.

Ich habe jetzt die Alternative genommen, dass es zuerst das CategoryEntity lädt und dann separat zu dessen ID die ProductCollection.

So kann ich alle Limits einhalten und mit Criteria finde ich es lesbarer als z.B. mit dem QeryBuilder.

Wenn noch jemand eine Idee hat warum das mit der Association und setLimit so komisch funktioniert, gerne her damit. :slight_smile: