2017-01-23 5 views
0

Ich frage mich, ob es möglich ist, zu ändern, so dass ich nur die IDs der verwandten Entitäten erhalten. Weil Foo mit 'einem Benutzer' und 'mehreren Gruppen' verwandt ist, bekomme ich immer das 'ganze Benutzerobjekt' und 'ALLE Gruppenobjekte' im Ergebnis, was das Ergebnis sehr unklar macht. Ist es also möglich, nur die IDs der zugehörigen Objekte zu drucken?(Symfony) Doktrin ORM findAll: zu viele Informationen

Ich hoffe, dass mir jemand helfen kann. Vielen Dank!

+2

In diesem Fall sollten Sie anstelle der integrierten Repository-Methoden DQL verwenden. –

Antwort

-1

Sie müssen Ihre eigene benutzerdefinierte Abfrage schreiben:

$query = $this->getDoctrine()->getManager()->createNativeQuery('SELECT id FROM foo'); 
$foos= $query->getResult(); 

die oben sollte arbeiten sehen hier für weitere Informationen http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html

+1

Native Abfragen sind ein schlechter Vorschlag, da sie die DBAL umgehen und Ihre Anwendung an ein bestimmtes DB-Produkt binden. Native Abfragen sind immer der letzte Ausweg, nur wenn alles andere fehlschlägt. – lxg

+0

Was ist auch der Punkt von 'WHERE 1 = 1'? Dies macht nur bei schlechten Anwendungen Sinn, die die SQL-Anweisung durch obskure Filter erweitern. (* hust * ... WordPress ... * hust *) – lxg

+0

Es ist zu sagen, alles auswählen ... Es tut mir leid, ich verwende Lehre so sehr ich selten sql Abfragen schreibe. Und da er keine externen Eingaben von dem Benutzer in diese stellt, sehe ich nicht, warum das weniger sicher wäre ... –

5

Sie müssen nicht den vollständigen Entitäten abrufen, können Sie als Wählen Sie nur die Felder aus, die Sie benötigen. Anstelle einer Entitätsliste erhalten Sie eine Liste von einfachen Arrays, wobei jedes Array die ausgewählten Felder enthält.

$ids = $em->createQueryBuilder() // $em is your entity manager 
    ->select("foo.id") 
    ->from("AppBundle:Foo", "foo") 
    ->getQuery()->getResult(); 

$ids = array_map("current", $ids); 

Hinweis: Die letzte Zeile ist optional, sie "flacht" das Array ab, wenn Sie nur ein Feld auswählen.

+0

Zusätzlich zu dieser Lösung würde ich vorschlagen, 'getResult (AbstractQuery :: HYDRATE_SCALAR)' zu tun. Es macht die letzte Zeile des Codes unnötig, sobald Doctrine das Ergebnis von 'getResult' ein Array machen wird – Stepashka

+0

@Stepashka Vielleicht können Sie erklären, warum Sie dies vorschlagen und was diese Zeile genau tut? Nur Dinge ohne irgendeine Erklärung vorschlagen, wird niemandem helfen. – Wilt

+0

@lxg Wenn bestimmte Assoziationen als 'fetch =" EAGER "' markiert sind, kann dies trotzdem zu unnötigen Joins führen, oder? Oder nicht? – Wilt

Verwandte Themen