2013-01-22 3 views
2

La requête suivante renvoie un tableau contenant les ID appropriés, mais null pour toutes les valeurs.CakePHP findList ne renvoie pas les valeurs agrégées

Si je supprime la fonction d'agrégation (AVG()), elle renvoie des valeurs (pas la moyenne, bien sûr), si je choisis par ex. find('all') il renvoie la moyenne, mais pas dans le format de liste que je veux (je pourrais travailler avec cela, mais je veux essayer de le faire avec 'list' d'abord).

$progress = $this->Trial->find('list', array(
    'fields' => array(
     'Trial.session_id', 
     'AVG(Trial.first_reaction_time_since_probe_shown) AS average_reaction_time' 
    ), 
    'group' => 'Trial.session_id', 
    'conditions' => array(
     'Trial.first_valid_response = Trial.probe_on_top', 
     'TrainingSession.user_id IS NOT NULL' 
    ), 
    'contain' => array(
     'TrainingSession' => array(
      'conditions' => array(
       'TrainingSession.user_id' => $this->Auth->user('id') 
      ) 
     ) 
    ), 
    'recursive' => 1, 
)); 

La requête SQL générée retourne exactement le résultat que je veux, quand je l'envoie à la DB via phpMyAdmin. J'ai examiné the source for find('list'). Je pense que c'est dû au "chemin du tableau" pour accéder à la liste qui se fout en utilisant les fonctions dans la requête, mais je ne pouvais pas encore le résoudre (ou reconnaître mon abus de la logique de CakePHP).

Répondre

2

Une fois que j'ai posté la question, Stackoverflow a commencé à me lier le correct answers.

Apparemment, cela ne peut pas être fait avec 'list' sans virtualFields.
Je ne m'attendais pas à cela parce que cela fonctionnait en utilisant les autres find-types.

$this->Trial->virtualFields = array(
    'average_reaction_time' => 'AVG(Trial.first_reaction_time_since_probe_shown)' 
); 
$progress = $this->Trial->find('list', array(
    'fields' => array('Trial.session_id','average_reaction_time') 
    /* etc... */ 
)); 
+1

s'il vous plaît formater vos questions/réponses pour une meilleure lisibilité (et si vous avez pas déjà - accepter votre propre réponse =)) – AD7six

+0

@ AD7six Il y a deux jour bloc sur l'acceptation de votre propre réponse. Si quelqu'un peut me dire pourquoi je dois utiliser des champs virtuels pour '' list'', mais pas pour '' all '', cela me donnerait une meilleure réponse. – Ruben

+0

Comparez les tableaux de données retournés par 'find ('all')' avec et sans utiliser de champ virtuel pour un champ calculé et vous aurez la réponse :) – ADmad

Questions connexes