если вы хотите сохранить среднее значение в поле в таблице элементов, то 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, чтобы увидеть, как он структурирован, но я думаю, что я правильно понял.