Doctrine2 (Doctrine 2.1) eifriges Laden in Symfony2
Sagen wir, ich habe zwei Personen in meinem Symfony2 Projekt : Category
und Article
(eine Kategorie mit vielen Artikeln).
In meinem CategoryRepository
habe ich diese Methode:
findAllDummy(){
return $this->createQueryBuilder('c')
->leftJoin('c.Articles a')
->getQuery()->getResult();
}
Wenn ich mich gut daran erinnern, in Symfony1.4 (und die entsprechende version der Lehre), die zurückgegebenen Objekte haben Ihre 'Erzeugnisse' - Attribut gefüllt, indem die entsprechenden Article
Objekte.
Nun, in Symfony2, Proxy-Objekte zurückgegeben.
Also wenn ich die Schleife Durchlaufen, einer bestimmten Kategorie von Artikeln, So viele Abfragen wie Iterationen ausgeführt werden.
foreach($category->getArticles() as $article){
echo $article->getDoctrine()
->getRepository('')getTitle();
}
Ich verstehe, das ist Doctrine2.1 ist default lazy loading-Verhalten.
Frage 1: wie ist das eine bessere Lösung?
N-Abfragen anstelle von 1.
Ich versuchte, Sie zu zwingen, eager loading, indem Sie Folgendes tun:
findAllDummy(){
return $this->createQueryBuilder('c')
->leftJoin('c.articles a')
->getQuery()
->setFetchMode('Category', 'articles', 'EAGER')
->getResult();
}
Aber das Ergebnis bleibt das gleiche.
Frage 2: wie Kraft eager loading in Doctrine2?
InformationsquelleAutor der Frage Guillaume Flandre | 2012-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beitreten Sie sind eine Tabelle, aber Sie sind nicht die Auswahl etwas von ihm. Hinzufügen
->addSelect('a')
zu der Abfrage-generator. Betrachten die beiden folgenden SQL-Abfragen, um den Unterschied zu verstehen:Eager/lazy-Beitritt hat nichts zu tun mit DQL-Abfragen. Es definiert, welche geladen werden soll, wenn Sie
$articleRepository->find(123)
.InformationsquelleAutor der Antwort Crozin
In dem Teil, wo Sie versuchen, zu "Kraft eager loading" das problem könnte sein, dass Sie die
fetchMode
Methode mit der falschen Variablen-Typ für die$fetchMode
argument. Übergeben Sie eine Zeichenfolge'EAGER'
aber die Methode nicht erwarten, dass ein string sondern ein integer.Die Methode erwartet Konstanten aus der
ClassMetadata
Klasse:In der Lehre Dokumentation Kapitel 14.7.6.6. Ändern Sie vorübergehend fetch-Modus in DQL sehen Sie ein Beispiel, wie dieses verwenden:
So übergeben Sie entweder einen Verweis auf die Konstante oder eine ganze Zahl, entspricht dem Modus, den Sie verwenden möchten.
InformationsquelleAutor der Antwort Wilt
So wie es in der Lehre docseager loading ' - in diesem Fall wird nicht keinen Unterschied machen, denn Sie haben eine-zu-viele-Beziehung zwischen Kategorie und Artikel.
Also im Gegensatz zu dem, was @Crozin hat gesagt, man kann immer noch eager loading in DQL.
Wenn Sie eine eins-zu-eins oder viele-zu-eins-Beziehung, eager loading zu lösen, wird das problem der Herstellung von extra-Abfragen. Aber um Ihr problem zu lösen in diesem Fall sollten Sie
->addSelect('a')
@Crozin erwähnt.InformationsquelleAutor der Antwort mufmuf
Ist es eine bessere Lösung sein, weil joins sehr viel teurer Prozess als eine einfache Abfrage. Während es scheinen mag ineffizient, es ist nicht viel von einer Verschwendung, und schnell wird effizienter, wenn Sie nicht laden, jedes bit jedes Verwandte Objekt.
InformationsquelleAutor der Antwort MrGlass