2010-11-22 29 views
3

je le tableau suivantdoctrine instruction select renvoie toujours tous les champs de la table

Test: 
    tableName: test 
    columns: 
     test_id: 
      name: test_id as id 
      primary: true 
      autoincrement: true 
      type: integer 
      notnull: true 
     test_name: 
      name: test_name as name 
      type: string(255) 
     test_title: 
      name: test_title as title 
      type: string(255) 

et cette déclaration dql

$dql = Doctrine_Query::create()->select('t.name')->from('Model_Test t'); 

le ist sql suivant généré

SELECT t.test_id AS t__test_id, t.test_name AS t__test_name FROM test t 

mais après aller chercher le résultat dans la doctrine, j'ai accès au champ de titre même s'il n'est pas sélectionné:

foreach ($results as $result) { 
    foreach ($result as $filed => $value) { 
     echo "$filed => $value <hr>"; // echoes 'title' => null but title in db has other value 
    }         
}         

également un vidage via Zend_Debug :: dump ($ results-> toArray()); me montre tous les champs comme si j'aurais fait un select *

Alors comment limiter les champs retournés pour correspondre à ma sélection?

Merci à l'avance

Martin

+0

Avez-vous déjà trouvé la solution pour cela? Je me bats aussi avec ça. Je ne veux pas passer des déchets inutiles comme json pour les consommateurs ajax. –

+0

Nevermind, -> setHydrationMode (Doctrine :: HYDRATE_ARRAY) l'a résolu. –

Répondre

0

Je ne suis pas sûr, mais je pense que la doctrine sélectionne juste id et name, mais lorsque vous essayez d'accéder à title il voit que title n'est pas tiré par les cheveux de DB. Donc la doctrine restitue cet objet (seulement cette fois en utilisant SELECT * ou une requête similaire).

Si vous avez une sorte de profileur de requête Doctrine - vous pourriez probablement voir toutes les requêtes supplémentaires requises dans la boucle foreach.

Juste un quess sauvage, par la voie ...

Oh, vous pouvez utiliser $query->execute(Doctrine::HYDRATE_ARRAY) si vous voulez sélectionner uniquement une partie des champs.

+1

oui et non: doctrine récupère tous les champs, mais seuls les champs sélectionnés ont une valeur (le titre apparaît comme nul même s'il a une autre valeur dans la table). Ceci est déroutant: Si la requête est externalisée dans une bibliothèque, l'utilisateur qui utilise la bibliothèque n'a aucune idée de la requête. Il ne sait pas si le titre est nul parce qu'il n'est pas sélectionné, ou si le titre est nul dans le db.Je cherche un moyen d'itérer sur les champs sélectionnés et seulement sur les champs sélectionnés ... – Martin

3

je suppose:

parce

$results = $dql->execute(); 

récupère le résultat comme un objet, les vars non sélectionnés sont remplis avec des valeurs nulles

alors

$results = $dql->fetchArray(); 

récupère un tableau et dans ce cas, seuls les champs sélectionnés apparaissent (en plus de la clé primaire)

+0

Cela a fait une différence pour moi. Vous pouvez également passer le paramètre 'Doctrine_Core :: HYDRATE_ARRAY' comme deuxième paramètre à' execute' ou 'fetchOne', et vous obtiendrez le même résultat que' fetchArray'. –

1

Celui-ci travaille pour moi, et ne récupèrera que les champs sont de savoir:

$events = Doctrine_Query::create() 
    ->select("e.id, e.Title, e.Lat, e.Lon, e.Startdate, e.Location, e.Url") 
    ->from('Event e') 
    ->setHydrationMode(Doctrine::HYDRATE_ARRAY) 
    ->execute(); 

Le tableau résultant ne contiendra que les champs sélectionnés