Я хотел внедрить систему уведомлений для нашей школы, это php/mysql webapp, которая не открыта для публики, поэтому она не получает большого трафика. "ежедневно 500-1000 человек".
1. В моем первоначальном подходе использовались триггеры MYSQL:
Я использовал Mysql AFTER INSERT trigger
, чтобы добавить записи в таблицу с именем notifications
. Что-то вроде.
'CREATE TRIGGER `notify_new_homwork` AFTER INSERT ON `homeworks`
FOR EACH ROW INSERT INTO `notifications`
( `from_id`, `note`, `class_id`)
VALUES
(new.user_id,
concat('A New homework Titled: "',left(new.title,'50'),
'".. was added' )
,new.subject_id , 11);'
Этот вид черной магии работал очень хорошо, но я не мог отслеживать, является ли это уведомление новым "показать количество новых уведомлений для пользователя". поэтому я добавил страницу с уведомлениями.
Уведомления извлекаются с помощью
SELECT n.* from notifications n
JOIN user_class on user_class.class_id = n.class_id where user_class.user_id = X;
Примечание: таблица user_class привязывает пользователя к классу "user_id, class_id, subject_id" -subject равна null, если пользователь не является преподавателем
Теперь мои следующие проблемы.
- как отслеживать новые старые уведомления на пользователя?
- Как я могу агрегировать уведомления, похожие на пользователя в одну строку?
Например, если 2 пользователя прокомментировали что-то, то не вставляйте новую строку, просто обновляйте старую с помощью чего-то вроде userx и еще 1 прокомментировали hw.
Спасибо большое
Edit
В соответствии с нижеприведенным ответом, чтобы установить флаг чтения/непрочтения в строке, мне нужно будет иметь строку для каждого ученика, а не только строку для всего класса.. что означает редактирование триггера на что-то вроде
insert into notifications (from_id,note,student_id,isread)
select new.user_id,new.note,user_id,'0' from user_class where user_class.class_id = new.class_id group by user_class.user_id