Ich versuche ein Kriterium nach zu erstellen Doku Docs .
Leider sagen sie Ihnen nicht, wie Sie auf Attribute eines verwandten Objekts zugreifen. Lassen Sie mich Ihnen ein Beispiel geben.
Ich habe eine ArrayCollection von Produkten. Jedes Produkt hat eine Kategorie. Ich möchte die ArrayCollection nach einem Kategorienamen filtern. Jetzt versuche ich ein Kriterium wie folgt einzurichten:
%Vor%Jetzt bekomme ich folgende Ausnahme:
%Vor%Wie kann ich auf ein zugehöriges Objekt zugreifen?
Ich habe in den Quellcode Criteria::expr()->eq("name", --- second value ---)
geschaut. Der zweite Wert erwartet eine Instanz von Doctrine\Common\Collections\Expr\Value
. Es ist also nicht möglich, ein weiteres Expr
oder criteria
hinzuzufügen. Nur die Expr
And
und Or
nehmen eine weitere Expr
.
Ich bin mir ziemlich sicher, dass Sie dies mit anderen Funktionen wie filter()
lösen oder einen Iterator mit getIterator()
erhalten. So kann es mit der filter()
Methode gemacht werden.
Wenn Sie Iterator
für jede nächste Relation verwenden können, können Sie foreach Schleifen verschachteln und in diesen filtern.
Das gehört wahrscheinlich eher zu einer Repository-Methode als zu einer Filtermethode. Wenn Sie eine vorgefilterte Liste von Produkten in einer Sammlung für ein übergeordnetes Objekt (z. B. eine Bestellung oder etwas) abrufen möchten, können Sie die untergeordnete Sammlung im Abfrage-Generator filtern. Sie müssen sich jedoch mit der möglicherweise verwirrenden Nebenwirkung von nicht vollständig hydratisierten Objekten auseinandersetzen.
Dies sollte Ihnen eine Liste von Order
-Objekten geben, die nur Product
children haben, die mit einem Kategorienamen übereinstimmen.
Wenn Sie erst später wissen, welche Art von Kategorien Sie interessieren, sollten Sie die Lösung von @ Flip wahrscheinlich besser verwenden und alle Kategorien vorhydratisieren. Mit partieller Flüssigkeitszufuhr und Standard ArrayCollection::filter()
closures, funktioniert in den meisten Fällen ziemlich gut.
Das heißt, es wäre ziemlich nett als Feature. Ich vermute, dass die Doktrin-Leute nur widerwillig sind, weil die aktuelle Criteria
-Implementierung sehr leicht ist und sie es wahrscheinlich so behalten wollen.