Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 29 мар 2024, 01:44

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 30 апр 2014, 19:26 
Не в сети
Новичок

Зарегистрирован: 07 июл 2013, 19:44
Сообщения: 15
У меня есть две модели: 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, объект с заранее посчитаным рейтингом.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 май 2014, 15:01 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Используй 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 столбец или же использовать кеш.

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group