La Doctrine 2.3 Critères. L'accès à un Objet connexe
Je suis en train de mettre en place une liste de Critères à la Doctrine Docs.
Malheureusement, ils ne vous diront pas comment accéder aux attributs d'un Objet. Laissez-moi vous donner un exemple.
J'ai un type arraycollection de Produits. Chaque Produit a une Catégorie. Je veux filtrer le type arraycollection un Nom de Catégorie. Maintenant, je suis en train de mettre en place des Critères comme suit:
$criteria = Criteria::create()
->where(Criteria::expr()->eq("category.name", "SomeCategoryName"));
Maintenant, je reçois l'Exception suivante:
An exception has been thrown during the rendering of a template ("Unrecognized field: category.name")
Comment puis-je accéder à un Objet connexe?
OriginalL'auteur Robin | 2013-08-09
Vous devez vous connecter pour publier un commentaire.
J'ai regardé dans le code source
Criteria::expr()->eq("name", --- second value ---)
. Deuxième valeur s'attend à une instance deDoctrine\Common\Collections\Expr\Value
. Il n'est donc pas possible de mettre un autreExpr
oucriteria
. Seul leExpr
And
etOr
prendre un autreExpr
.Je suis assez sûr que vous êtes supposé résoudre cela avec d'autres fonctions comme le
filter()
ou obtenir un itérateurgetIterator()
. C'est la façon dont il peut être fait avec lefilter()
méthode.Si vous pouvez un
Iterator
pour chaque relation que vous pouvez imbriquer des boucles foreach et le filtre à l'intérieur de ceux-ci.Ctriteria
lundi. Droit maintenant, je n'ai pas accès à mon poste de travail. Je vais vous laisser savoir si cela fonctionne. Cependant filtre est une mauvaise idée à mon avis, parce que toutes les Catégories seront désireux chargé et ensuite traitées localement sur le disque (Ce qui ne sera jamais aussi perfomant que de le faire sur une DB).Vous êtes mal informé. Les critères peuvent être utilisés dans une requête (les données doivent être récupérées) ainsi que sur un type arraycollection (déjà récupéré des données). Si vous n'avez pas d'extraction-joint le rapport sera désireux chargé si vous utilisez des critères ou des filtre(). Vous avez raison, la DB qui vous donne plus de performance il est donc préférable d'utiliser fetch rejoindre en combinaison avec OÙ les. Si ce n'était pas ce que votre question était de savoir.
J'ai pensé qu'il serait possible d'annoter vos entités, de sorte qu'ils sont paresseux, chargé? docs.doctrine-project.org/en/2.0.x/reference/.... Ne serait-ce pas charger le
ArrayCollection
paresseux? Ou ne serait-ce pas le travail parce que c'est l'inverse d'Annotation?Ils sont paresseux, chargé par défaut si vous ne spécifiez pas l'annotation. Cependant, lorsque vous êtes à l'aide de critères (avec la mise en correspondance() la méthode) sur un non-récupérées type arraycollection, il va commencer à lazy load tout aussi bien comme il le ferait avec filtre(). Le propriétaire/l'inverse possibilité n'est pas liée à cela.
matching
méthode avecCriteria
charge uniquement les enregistrements qui satisfont à ce critère.filter
méthode des forces collection complète de la charge.OriginalL'auteur Flip
Qui appartient probablement à un référentiel méthode, plutôt que d'une méthode de filtre. Si vous êtes désireux d'obtenir un pré-filtre de la liste des Produits dans une collection sur un objet parent (comme un Ordre ou quelque chose), vous pouvez filtrer l'enfant de la collection dans le générateur de requêtes. Cependant, vous avez à traiter avec le peut-être déroutant de ne pas avoir totalement hydraté objets.
Cela devrait vous donner une liste de
Order
objets, qui n'ayantProduct
enfants correspondant à un nom de catégorie.Si vous ne savez pas quel type de catégories que vous êtes intéressé jusqu'à ce que plus tard, alors vous êtes probablement mieux à l'aide de @Flip de la solution de toute façon, et de pré-hydratant toutes les catégories. À l'aide de partielle de l'hydratation et standard
ArrayCollection::filter()
fermetures, effectue assez bien dans la plupart des cas.Cela dit, il serait tout à fait agréable comme une fonction. Je soupçonne que la Doctrine gars seraient réticents, car le courant
Criteria
mise en œuvre est très léger-poids et ils veulent probablement pour garder de cette façon.OriginalL'auteur Ryan