2013-01-19 6 views
9

Ho bisogno di una colonna semplice per una tabella.Seleziona una colonna Doctrine DQL

Ad esempio una tabella "progetto", con colonna id, name e year.

Se lo faccio:

$q = Doctrine_Query::create() 
     ->select('a.pro_id') 
     ->from('fndr_proyecto a') 
     ->where('a.pro_id =?',1); 
    $pro = $q->execute(); 
    json_encode($pro->toArray()); 

La risposta è tutto colonna come

{"id":1,"name":"Project name","year":2013} 

ma ho bisogno di una sola colonna. Mi aspetto:

{"id":1} 

E 'con DQL perché con nativo bel lavoro SQL.

L'ORM è costruito automaticamente con un Paradigma visivo.

risposta

26

Questo perché Doctrine idrata la risposta con tutte le informazioni sull'oggetto, quindi tutte le colonne.

è necessario utilizzare un metodo di idratazione diverso, there are many one, ma concentriamoci su 5 di loro:

  • HYDRATE_RECORD, quella di default
  • HYDRATE_ARRAY
  • HYDRATE_NONE
  • HYDRATE_SCALAR
  • HYDRATE_ARRAY_SHALLOW

È necessario il metodo di idratazione HYDRATE_ARRAY_SHALLOW. Ecco perché.

  1. HYDRATE_RECORD

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_RECORD); 
    var_dump(json_encode($pro->toArray())); 
    

    Questo sarà idratare il risultato usando oggetto, e idratare anche le relazioni (se si utilizza un leftJoin all'interno della vostra query).Dal momento che ritorna oggetto, abbiamo bisogno di chiamare toArray() per essere in grado di inviare un JSON propre:

    [{"id":1,"name":"Project name","year":2013}]" 
    
  2. HYDRATE_ARRAY

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY); 
    var_dump(json_encode($pro)); 
    

    Questo sarà idratare risultato come un array di aggiungere automaticamente la chiave primaria :

    [{"id":"1","pro_id":"1"}]" 
    
  3. HYDRATE_NONE

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_NONE); 
    var_dump(json_encode($pro)); 
    

    Ciò non idratare risultato e tornare solo valori:

    [["1"]]" 
    
  4. HYDRATE_SCALAR

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_SCALAR); 
    var_dump(json_encode($pro)); 
    

    Ciò idratare risultato dal select ma con indice tonalità il nome della colonna con l'alias della tabella:

    [{"a_pro_id":"1"}]" 
    
  5. HYDRATE_ARRAY_SHALLOW

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY_SHALLOW); 
    var_dump(json_encode($pro)); 
    

    Questo sarà idratare risultato dal select ma con indice chiave come il nome della colonna, senza l'alias tavolo:

    "[{"pro_id":"1"}]" 
    
+0

Naturalmente! Ora trova il capitolo nella documentazione "Data Hydrators". Non sapevo che riguardasse l'argomento. Grazie mille! ;) –

+0

@ h3g0r_ provali, l'idratazione dell'array è spesso più veloce e più leggera dell'idratazione record! – j0k

+0

Ottima spiegazione, sono sempre stato sconcertato su come funziona l'idratatore, ma ora tutto è chiaro nella mia mente. Grazie ! – TwystO

0

io non sono sicuro quale versione di Doctrine j0k stava usando. Ha fornito alcune risposte, ma ho avuto difficoltà a trovare le classi Doctrine_Query e Doctrine_Core. Sto usando Doctrine 2.3.4. Il seguente ha funzionato per me.

public static function getAllEventIDs($em) { 
    return parent::getAllFromColumn('\path\to\Entity\entityName', 'id', $em); 
} 

public static function getAllFromColumn($tableName, $columnName, $em) { 
    $q = $em->createQueryBuilder('t') 
    ->select("t.$columnName") 
    ->from($tableName, 't'); 

    $q = $q->getQuery(); 

    $result = $q->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR); 

    return $result; 
} 

Ciò ha tuttavia restituito una matrice di matrici. cioè, l'id del primo evento era

$result[0]['id'];