2011-05-20 46 views
1

我有這個疑問:CakePHP的計算平均問題

$this->set('grades', $this->Grade->Query(" 
SELECT AVG(grade), 
sections.section_name 

FROM grades, 
sections 

WHERE sections.id = grades.section_id 

AND grades.user_id =".$id." 

GROUP BY grades.section_id")); 

,我用它來輸出數據:

<?php foreach($grades as $grade): ?> 
    <tr> 
     <td><?php echo $grade['Grade']['AVG(grade)']; ?></td> 
    </tr> 
<?php endforeach;?> 

但它給了我一個「預警指標等級未找到」。我懷疑它與['AVG(grade)']有關,因爲當我刪除AVG(等級)時,它輸出正常(顯然沒有avg值)

有沒有人可以幫忙?

編輯

debug($grades) outputs: 

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [avg_grade] => 4.75000 
       ) 

      [sections] => Array 
       (
        [section_name] => Nederlands 
       ) 

     ) 

    [1] => Array 
     (
      [0] => Array 
       (
        [avg_grade] => 6.50000 
       ) 

      [sections] => Array 
       (
        [section_name] => Engels 
       ) 

     ) 

) 

回答

5

首先,做debug($grades)來查看平均值存儲在數組結構中的哪裏。您還可以在查詢中將其命名爲其他內容,例如SELECT AVG(grade) AS average。作爲一個方面說明,你不需要使用原始查詢(可能是一個偏好問題,但我傾向於儘可能避免它們)。你可以做

$this->Grade->find(
    'all', 
    array(
    'conditions' => array(
     'Grade.user_id' => $id 
    ), 
    'recursive' => 1, 
    'fields' => array( 
     'AVG(Grade.grade) AS average', 
     // +whatever else you need 
    ) 
    'group' => 'Grade.section_id' 
) 
); 

在這種情況下,當你做foreach($grades as $grade)的平均值將在$grade[0]['average']

+0

非常感謝你!它的工作。 – DaDu 2011-05-20 11:05:50

0

做一個SELECT AVG(grade) AS avg_grade這將作爲
$grades['Grade']['avg_grade']

+0

Stil給我指數等級找不到警告。有沒有一個cakephp aproach做同樣的查詢? – DaDu 2011-05-20 10:40:01

+1

它的'$等級['等級']'(s!)而不是'$等級['等級']'!您正在查看錯誤的PHP變量! – powtac 2011-05-20 10:42:07

+0

是的,你總是可以打印出整個變量來查看結構是什麼。 'debug()'是CakePHP必須提供的最有用的函數。 – JJJ 2011-05-20 10:52:04

0

下面CakePHP中3.5

//用戶對我的查詢工作是我的表
//默認情況下,用戶的評價將是0 that`s爲什麼設置where子句> 0

$query = $this->Users->find(); 

$ratingAverage = $query->select(['averageRating' => $query->func()->avg('user_rating')]) 
->where(['user_rating' => $userId,'provider_rating >' => 0])->group('user_rating')->first(); 

Refer here