2013-02-23 1 views
6

Sto cercando di perfezionare la query cercando di selezionare un minor numero di valori possibili. Ad esempio, ho un'entità "Anagrafic" che contiene il tuo nome, indirizzo, città, ecc., e un modulo in cui voglio cambiare solo uno di questi campi, come l'indirizzo. Ho creato questa query:Symfony2 Selezionare una colonna nella dottrina

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

    return $qb->getResult(); 
} 

c'è qualcosa di sbagliato in questa query perché non restituisce alcun valore, ma se lo faccio la query normalmente:

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

ritorno il giusto valore. Come faccio una query selezionando solo una colonna?

+2

Il mio obiettivo era quello di ridurre le dimensioni del query, restituire una singola colonna di 30 colonne è molto meglio in termini di prestazioni! – Lughino

+2

Allora lo farai ovunque? Farò meglio a separare il tuo tavolo per pochi altri tavoli in questo caso. – Hast

+4

Ho pensato che fosse un buon modo per ottenere prestazioni! Se non sei d'accordo non importa .. – Lughino

risposta

11

Poiché si richiede una singola colonna di ciascun record, è necessario aspettarsi un array. Detto questo è necessario sostituire getResult con getArrayResult() perché non è possibile far valere oggetto idratazione:

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

Spero che questo aiuti.

Per quanto riguarda la discussione sulle prestazioni nei commenti, di solito sono d'accordo con te per non volere tutte le 30 colonne recuperate ogni volta. Tuttavia, in questo caso, dovresti considerare di scrivere query denominate al fine di ridurre al minimo l'impatto se il database viene alterato.

+0

Davvero grazie mille per l'aiuto! È esattamente l'informazione che stavo cercando! – Lughino

7

È possibile utilizzare partial objects per idratare solo un campo e restituire ancora un oggetto.

+2

Grazie! Questa è anche un'ottima soluzione! – Lughino

2

Utilizzare oggetti parziali come questo per selezionare i campi

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

mettere i vostri nomi di campo tra le parentesi

+0

... ma tieni presente la documentazione http://doctrine-orm.readthedocs.org/en/latest/reference/partial-objects.html – TheFrost

3

Questo ha funzionato per me:

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