2

次のクエリは、適切な ID を含む配列を返しますが、すべての値が null です。

集計関数(AVG())を削除すると、値が返されます(もちろん平均値ではありません)。たとえばfind('all')、平均値を返しますが、希望するリスト形式ではありません(それで作業できますが、試してみたい最初にそれを行う'list')。

$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,
));

生成された SQL クエリは、PhpMyAdmin 経由で DB に送信すると、必要な結果を正確に返します。

SELECT 
    `Trial`.`session_id`, 
    AVG(`Trial`.`first_reaction_time_since_probe_shown`) AS average_reaction_time 
FROM 
    `zwang`.`trials` AS `Trial` 
LEFT JOIN 
    `zwang`.`training_sessions` AS `TrainingSession` ON (
        `Trial`.`session_id` = `TrainingSession`.`id` AND
        `TrainingSession`.`user_id` = 1
    )
WHERE 
    `Trial`.`first_valid_response` = `Trial`.`probe_on_top` 
GROUP BY 
    `Trial`.`session_id`

find('list') のソースを調べました。クエリで関数を使用すると、リストにアクセスするための「配列パス」が台無しになるためだと思いますが、まだ修正できませんでした(またはCakePHPロジックの乱用を認識しました)。

4

1 に答える 1

2

質問を投稿すると、Stackoverflow は正しい回答を私に関連付け始めました。

'list'どうやら、なしではできないようvirtualFieldsです。
他の検索タイプを使用して機能したため、私はそれを期待していませんでした。

$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... */ 
));
于 2013-01-22T11:10:46.817 に答える