2013-02-23 18 views
6

Ich versuche, die Abfrage zu verfeinern versuchen weniger mögliche Werte zu wählen .. Zum Beispiel habe ich eine Entität "Anagrafic", die Ihren Namen, Adresse, Stadt usw. enthält, und ein Formular, in dem ich nur eines dieser Felder ändern möchte, z. B. die Adresse. Ich habe diese Abfrage erstellt:Symfony2 Wählen Sie eine Spalte in Doktrin

//AnagraficRepository 
public function findAddress($Id) 
{ 
    $qb = $this->createQueryBuilder('r') 
      ->select('r.address') 
      ->where('r.id = :id') 
      ->setParameter('id', $Id) 
      ->getQuery(); 

    return $qb->getResult(); 
} 

es ist etwas falsch mit dieser Abfrage, weil ich keinen Wert zurück, aber wenn ich die Abfrage tun normalerweise:

//Controller 
$entity = $em->getRepository('MyBusinessBundle:Anagrafic')->find($id); 

Rückkehr der richtige Wert. Wie mache ich eine Abfrage, die nur eine Spalte auswählt?

+2

Mein Ziel die Größe der zu reduzieren, war Abfrage, geben Sie eine einzelne Spalte als 30 Spalten ist viel besser in Bezug auf die Leistung! – Lughino

+2

Dann werden Sie es überall tun? Ich würde deinen Tisch lieber für ein paar andere Tische in diesem Fall trennen. – Hast

+4

Ich dachte, es wäre ein guter Weg, an Leistung zu gewinnen! Wenn Sie nicht einverstanden sind, ist es egal .. – Lughino

Antwort

11

Da Sie eine einzelne Spalte jedes Datensatzes anfordern, müssen Sie eine array erwarten. Davon abgesehen Sie getResult mit getArrayResult() ersetzen sollte, weil Sie nicht Objekt Hydratisierung durchsetzen kann:

$data = $qb->getArrayResult(); 
Now, you have structure: 
    $data[0]['address'] 
    $data[1]['address'] 
    .... 

Hoffnung, das hilft.

Wie für die Diskussion über die Leistung in Kommentaren stimme ich Ihnen generell zu, dass Sie nicht alle 30 Spalten abrufen jedes Mal wollen. In diesem Fall sollten Sie jedoch benannte Abfragen schreiben, um die Auswirkungen zu minimieren, wenn Ihre Datenbank jemals geändert wird.

+0

Wirklich vielen Dank für die Hilfe! Ist genau die Information, die ich gesucht habe! – Lughino

7

Sie können partial objects verwenden, um nur ein Feld zu hydratisieren und trotzdem ein Objekt zurückzugeben.

+2

Danke! Dies ist auch eine ausgezeichnete Lösung! – Lughino

2

Verwenden Teilobjekte wie diese Felder auszuwählen

$qb = $this->createQueryBuilder('r') 
    ->select(array('partial r.{id,address}')) 
    ... 

Legen Sie Ihre Feldnamen zwischen den Klammern

+0

... aber bedenken Sie die Dokumentation http://doctrine-orm.readthedocs.org/en/latest/reference/partial-objects.html – TheFrost

3

Das ist für mich gearbeitet:

$qb = $repository->createQueryBuilder('i') 
    ->select('i.name') 
    ->... 
Verwandte Themen