Рассчитать новое среднее значение после сохранения (или что-то лучше?) В CakePHP - PullRequest
1 голос
/ 24 июля 2011

Я строю систему рейтинга, где пользователь может оценивать что-то от 1 до 5 звезд.

Мне было интересно, есть ли способ автоматически рассчитать все оценки конкретного элемента (из таблицы рейтингов, гдеmodel = 'x' и foreign_key = 'y') на afterSave или что-то похожее.

Я могу сделать это просто в Rating_controller ... просто подумал, что было бы лучше сделать это автоматически вмодель.Кто-нибудь может указать мне правильное направление для этого?

Мне очень хотелось бы услышать, что в CakePHP есть какая-то настройка ассоциации, которая позволяет ему делать это для вас - что-то вроде:

//Rating model
var $belongsTo = array(
    'Restaurant' => array(
        'averageValue' => 'rating
    )
);

Но - я уверен, что это многого требует:)

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

если вы хотите сохранить среднее значение в поле в таблице элементов, то AfterSave, вероятно, будет лучшим решением на данный момент.

Единственное, что торт может автоматически сделать для вас, - это отслеживать количество оценок элемента (counterCache), но не других агрегатных функций.

virtualField может быть хорошим, но я никогда не использовал это для агрегатных функций, поэтому я не уверен. Кроме того, если ваши рейтинги меняются не часто, это приведет к ненужной работе в системе.

В рейтинге модель:

function afterSave($created){
   $avgValue = $this->Query('SELECT AVG(rating) as rating FROM ratings WHERE ratings.restaurant_id = '.$this->restaurant_id);
   $this->Restaurant->updateRatingAverage($this->restaurant_id,$avgValue[0][0]['rating']);
}

В ресторане модель

function updateRatingAverage($id,$avg){  
   $this->id = $id;
   $this->field('your_average_field_here',$avg);
}

Возможно, вы захотите зарегистрировать $ avgValue, чтобы увидеть, как он структурирован, но я думаю, что я правильно понял.

1 голос
/ 24 июля 2011

Мне нужно написать и ответить, потому что я пока не могу комментировать.

Итак, ваши (например) рестораны имеют много рейтингов? Попробуйте VirtualField в модели ресторанов, где вы рассчитываете рейтинг каждый раз, когда рестораны выбираются из базы данных. Может потребоваться использование GROUP BY, например, упомянутого ypercube, если вам необходимо использовать AVG ().

...