2009-06-23 3 views
7

Nel seguente codice:Zend seleziona tutte le colonne


$selectColumns= array('user_id.user_email', // inner join the data from user_id and user_details 
          'user_details.first_name', 
          'user_details.last_name'); 
     $result = $handle->select()->from('user_id', $selectColumns) 
            ->where('user_id.uid=?', $uid) 
            ->join('user_details', 'user_id.uid = user_details.uid') 
            ->query(ZEND_DB::FETCH_OBJ); 

Zend seleziona tutti le colonne della tabella, non solo quelli richiesti.

Come selezionarne solo alcuni?

risposta

6

Il problema è nella tua join() chiamata di metodo:

->join('user_details', 'user_id.uid = user_details.uid') 

Il terzo argomento opzionale colonne questo tavolo. Se l'argomento è assente, il valore predefinito è user_details.*.

Si noti che sono state aggiunte colonne qualificate da entrambe le tabelle nella tabella from(), ma ciò non ha alcun effetto sul valore predefinito di user_details.*. Ci dispiace, ma lo Zend_Db_Select non è abbastanza intelligente per tenere traccia di tutto ciò.

È possibile effettuare la chiamata join() aggiungere nessuna colonna passando un array vuoto:

->join('user_details', 'user_id.uid = user_details.uid', array()) 

Le colonne qualificati aggiunti nella chiamata from() dovrebbero essere ancora lì. Per verificarlo, stampare l'SQL:

print $result . "\n"; // calls __toString() method on Zend_Db_Select object 
6

Aggiungi un altro parametro al tuo join alla fine: un array vuoto. Questo gli dirà di selezionare nessuna colonna dal join. Con il codice che hai ora, stai selezionando tutte le colonne dalla tabella unita.

->join('user_details', 'user_id.uid = user_details.uid', array()) 
+0

+1 per arrivare prima, +1 per Bill per i dettagli aggiuntivi. Perché solo le persone Zend votano Zend? – karim79

+0

+1 a James anche per la risposta. –