2009-06-23 13 views
7

Dans le code suivant:Zend sélectionne toutes les colonnes


$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 sélectionne toutes les colonnes de la table, pas seulement ceux demandés.

Comment puis-je en sélectionner uniquement?

Répondre

6

Le problème est dans votre appel de méthode join():

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

Le troisième argument optionnel est de colonnes ce tableau. Si l'argument est absent, il est par défaut user_details.*.

Notez que vous avez ajouté des colonnes qualifiées des deux tables dans la table from(), mais cela n'a aucun effet sur la valeur par défaut user_details.*. Désolé, mais Zend_Db_Select n'est tout simplement pas assez intelligent pour garder une trace de tout cela.

Vous pouvez faire l'appel join() ajouter aucune colonne en passant un tableau vide:

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

Les colonnes qualifiés ajoutés dans l'appel from() devrait encore être là. Pour le vérifier vous-même, imprimez le code SQL:

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

Ajoutez un autre paramètre à votre jointure à la fin - un tableau vide. Cela lui dira de ne sélectionner aucune colonne de la jointure. Avec le code que vous avez maintenant, vous sélectionnez toutes les colonnes de la table jointe.

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

+1 pour y arriver en premier, +1 pour Bill pour les détails supplémentaires. Pourquoi est-ce que seulement les gens de Zend votent les gens de Zend? – karim79

+0

+1 à James pour la réponse aussi. –