Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Автоматический расчет свойства при вызове модели
http://forum.kohanaframework.su/viewtopic.php?f=31&t=832
Страница 1 из 1

Автор:  Manyahin [ 30 апр 2014, 19:26 ]
Заголовок сообщения:  Автоматический расчет свойства при вызове модели

У меня есть две модели: Movies(id,title,director) и Ratings(id,movie_id,rating[0-10]).
Они связаны как одна ко многим, т.к. одно кино может иметь много рейтингов.
В Movies есть метод, который собирает все рейтинги и считает их средний показатель для объекта Movie - getRating();

Предыстория. Изначально я вытаскивал все фильмы благодаря find_all() и биндил их на View. Для последующей генерации таблицы. В таблице есть поле рейтинг, которое и должно его отображать. Я пошел простым путем и вызывал из View, метод модели getRating() для каждого обьекта Movie.

Все то было нормально, пока не зародилось сомнение. Я вызываю метод модели из отображения. Да ведь не нормально это, ведь паттерн MVC на то и предназначен, что бы все это дело по полочкам разложить. И стал я пытаться все это в контроллер или модель перенести, да ничего не получается.

Создал я в модели свойства $rating, что бы там рейтинг хранить. Функция getRating теперь меняет $this->rating у объекта, что бы потом его в View использовать. Да как вызвать его не представляю. Пробовал так:

Код:
$movies = ORM::factory('Movie')->find_all();
foreach ($movies as $movie)
{
  $movie->getRating();
}
$view = View::factory('movie_table')
      ->bind('movies', $movies);


По идеи должен быть заменить значение $rating в каждом из объектов, да не меняет нифига. Потом через символические ссылки пробовал:

Код:
$movies = ORM::factory('Movie')->find_all();
foreach ($movies as &$movie)
{
  $movie->rating = $movie->getRating();
}
$view = View::factory('movie_table')
      ->bind('movies', $movies);


То же ни в какую. Я стал думать над тем, что бы автоматически считать значение $rating при вызове модели, но не представляю как это сделать.

Подскажите старцы, что я делаю не так?

UPD: Короче, суть - передать во View, объект с заранее посчитаным рейтингом.

Автор:  WinterSilence [ 04 май 2014, 15:01 ]
Заголовок сообщения:  Re: Автоматический расчет свойства при вызове модели

Используй DB::select в своем методе подсчета, что-то вроде:

$rating = DB::select(array(DB::expr('SUM(`rating`)'), 'total_rating'))
->where('movie_id', '=', $movie_id)
->from($this->_table_name)
->execute($this->_db)
->get('total_rating', 0);

Бинд лучше до цикла было вставить т.к. иначе он теряет смысл.

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

Страница 1 из 1 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/