Русскоязычный форум, посвященный фреймворку 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 использовать. Да как вызвать его не представляю. Пробовал так: Код:
По идеи должен быть заменить значение $rating в каждом из объектов, да не меняет нифига. Потом через символические ссылки пробовал: Код:
То же ни в какую. Я стал думать над тем, что бы автоматически считать значение $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/ |