Symfony2 Custom-Repository, Lazy Loading-und Proxy-Objekte
Ich habe einige Schwierigkeiten ziehen sich bis relationed Objekte aus meiner Datenbank mit Doctrine2 in Symfony2. Ich habe ein benutzerdefiniertes repository mit der folgenden Funktion:
public function getOrder($id) {
$DQL = 'SELECT request, orderer
FROM OrderRequestBundle:OrderRequest request
JOIN request.orderer orderer
WHERE request.id = :id';
$query = $this->getEntityManager()->createQuery($DQL)
->setParameter('id', $id)
->setMaxResults(1);
return $query->getResult();
}
...aber aus irgendeinem Grund, wenn ich diese Funktion ausführen bekomme ich wieder ein Proxy-Objekt für ein OrderRequest-Objekt, anstatt eine echte Instanz von OrderRequest, bin ich etwas fehlt? Es scheint, dass Doctrine2 liebt lazy-loading und ich kann nicht scheinen, um es bis an seinen Arsch und Objekte Holen für mich.
UPDATE:
Ich bin versucht, einfach nur die Informationen angezeigt, die in einem Twig-template mit dem folgenden code:
$order = $this->getDoctrine()
->getRepository('OrderRequestBundle:OrderRequest')
->getOrder($id);
return $this->render('OrderRequestBundle:Admin:view.html.twig', array('order' => $order));
Wo Zweig und ruft die Informationen über die 'order' - variable als so:
{{ order.quantity }}
...aber ich bin einfach am Ende mit diesem Fehler:
Item "quantity" for "Array" does not exist in "OrderRequestBundle:Admin:view.html.twig" at line 5
- Irgendeinem Grund Sie nicht möchten, dass ein proxy-Instanz?
- Ich versuche zu greifen, Informationen über die OrderRequest-Objekt zur Anzeige auf einer Seite (über ein Twig-template), aber ich erhalte die Fehlermeldung, dass die Eigenschaften des Objekts nicht existieren. Ich werde zu aktualisieren, die Frage zu reflektieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPDATE
Angesichts Ihrer Bearbeitung, das problem ist nicht der proxy-Objekte, ist es, wie du mit deinen $query-Objekt.
$query->getResult()
wird ein array zurückgeben der Ergebnisse. In einer Instanz wie diese, in denen man die Begrenzung der Ergebnismenge zu einem max 1 Zeile, es wird return ein array mit einem Eintrag, aber immer noch ein array. Zweig drosseln auf diesem, wenn Sie versuchen, um die Verwendung von accessor-Methoden, natürlich.Was Sie tun möchten, verwenden Sie
$query->getSingleResult()
statt. Beachten Sie, dass die Lehre werden werfen Sie einen nicht eindeutigen Ergebnis der Ausnahme, wenn die Abfrage mehr als eine Zeile, so müssen Sie sicher sein, um es mitsetMaxResults(1)
wie Sie tun, wenn die Abfrage möglicherweise mehrere Ergebnisse zurückgeben.END UPDATE
Aus der Dokumentation auf Referenz-Proxys:
Schwerpunkt ihrigen. Proxies sollten transparent sein, um Ihren code, und existieren, um die Leistung zu verbessern, sofern möglich; jedoch, wenn Sie haben eine dringende Notwendigkeit, eager-load-Teil der Abfrage können Sie entweder die fetch-Modus in Ihre entity-Konfiguration-Datei, oder check-out dieser Abschnitt des docs:
Doctrine2 immer gibt proxy-Objekte aus dem repository Abfragen. Diese verlängern Ihre entity-Klassen und für alle Absichten und Zwecke, die gleiche Sache.
Proxies aktivieren Sie einfach Ihre Entitäten zu unterstützen, lazy-laden von verknüpften Entitäten (unter anderem).
Sehen http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html?highlight=proxy#entity-object-graph-traversal