开发者

Cakephp calculating average problem

开发者 https://www.devze.com 2023-03-07 01:23 出处:网络
I have this query: $this->set(\'grades\', $this->Grade->Query(\" SELECT AVG(grade), sections.section_name

I have this query:

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

And I use this to output the data:

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

But it gives me a "warning index Gra开发者_开发百科de not found". I suspect it got to do with the ['AVG(grade)'] because when I remove the AVG(grade) it outputs normal (without avg values obviously)

Is there anyone who can help?

EDIT

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
                )

        )

)


First, do debug( $grades ) to see where the average is stored in the array structure. You can also name it something else in the query, for example SELECT AVG( grade ) AS average.

As a side note, you don't need to use a raw query (perhaps a matter of preference, but I tend to avoid them if at all possible). You can do

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

In this case when you do foreach( $grades as $grade ) the averages will be in $grade[0]['average'].


Do a SELECT AVG(grade) AS avg_grade this will be available as
$grades['Grade']['avg_grade'].


Below Query work for me in cakephp 3.5

// users is my table
// By default user rating will be 0 in tables that`s why set where clause > 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

0

精彩评论

暂无评论...
验证码 换一张
取 消