@akula22

Как правильно при добавление комментария сделать +1 в поле новостей?

Есть модуль новости и модуль комментарии, как правильнее при добавление коммента добавлять +1 к полю в таблице новостей, а при удаление коммента делать -1,
для этого можно использовать события? Я с ними никогда не сталкивался, может есть пример реализации где посмотреть?
Комментарии не привязаны к новостям, они могут быть и в фотографиях, в видео
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
arutyunov
@arutyunov
Mooza.ru — Делаем сайты
Используйте метод updateCounters для изменения счетчика.

Вообще, если ваш сайт не высоконагруженный проект, то держать это поле нет особого смысла — один лишний запрос count() не вызовет больших проблем у сервера.
Тем более, Yii предоставляет удобные средства для связи моделей.

count($newsItem->comments);
Где comments — это все комментарии, связь hasMany() в модели.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Нужны таблицы "Новости", "Комментарии" и связывающая их таблица "Комментарии_в_Новостях". Последняя таблица содержит Id новости и Id комментария. Простым подсчетом строчек в этой таблице (по определенному Id новости) получаем количество комментариев. А если добавить оценку, то и среднюю оценку...
Ответ написан
vakorovin
@vakorovin
Разработчик
Сомнительная затея хранить дополнительно количество и постоянно заниматься синхронизацией реального количества с этим полем. Но. Если уж решили, что нужно - поступите проще, решите эту задачу средствами самой базы данных, благо они уже давно это умеют сами. 3 триггера на таблицу comments (insert, update, delete). И обновляйте поле количество в нужной таблице. И не нужно тогда привязываться к фреймворку, мало ли кто еще и откуда обновит эти таблицы. Как ориентир:
CREATE TRIGGER `insert_comment` AFTER INSERT ON `comments` FOR EACH ROW
BEGIN
  IF (NEW.material_type = 'post') THEN
    UPDATE posts SET comments_count = (SELECT COUNT(id) FROM comments WHERE material_id = NEW.material_id AND material_type = NEW.material_type) WHERE id = NEW.material_id;
  END IF;
END;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы