2014-10-14 5 views
-2

Я использую этот код http://codegains.com/2014/06/laravel-4-notification-system/ для моей системы уведомлений, он работает нормально. Но теперь у меня проблемы, пользователи залиты уведомлениями. Я имею в виду, что если 5 пользователям понравится одно изображение, автор этого изображения получит 5 уведомлений с «Пользователь X понравился ваша картинка image.png». Где X - 5 разных имен. Теперь я хочу знать, есть ли у кого-нибудь идея о том, как измениться, так что в приведенном выше случае пользователь получит только одно уведомление, в котором говорится: «Пользователям X, Y, Z понравилась ваша фотография image.png».Как обрабатывать уведомления пользователей для одного и того же объекта?

Edit: Вот структура таблиц «уведомления»
http://codegains.com/wp-content/uploads/2014/06/notifications-2.png

Теперь я пытаюсь извещений группы с перебором всех уведомлений, которые выбираются из БД с ORDER BY object_id и сравниваю текущий object_id с предыдущим и поэтому я получаю правильную форму. Но это занимает много времени, потому что оно начинается с каждой загрузки страницы (главная страница). И 1000 пользователей, с 1000 уведомлений ...: \

+1

Звуки для меня, как вам нужно добавить индекс на вашем 'is_read' поле, так что вы можете ускорить ваши запросы, а потом, вероятно, использовать какой-то группировки, чтобы получить список пользователей, которые «отправили» данное уведомление. Я не думаю, что это что-то, что Eloquent может сделать изначально, но вы должны проверить функцию MySQL GROUP_CONCAT', она будет группировать 'X, Y, Z', которую вы хотите получить в каждом типе уведомлений для данного пользователя. – alexrussell

+0

Я не знаю точно, как ваши таблицы подходят друг другу, но что-то вроде 'SELECT *, GROUP_CONCAT (user.name) AS user_names FROM notification LEFT JOIN user/* СОХРАНЕНИЕ СОСТОЯНИЯ ЗДЕСЬ */WHERE is_read = '0' AND user_id = '/* ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ */'GROUP BY subject' - это то, о чем я думаю. – alexrussell

ответ

1

Попробуйте группировать с created_at.

Вы проверите для created_at в течение 30 секунд и группируйте результаты и запускайте каждое уведомление, которое превышает 30 секунд, и в противном случае вы будете группировать и запускать группу.

Например:

$oNotifications = Notifications::where('is_read', '=', false)->get(); 

$aNotifyGroup = []; 
foreach($oNotifications as $oNotify) 
{ 
    if($oNotify->created_at->diffInSeconds(Carbon::now()) <= 30) 
    { 
     // Add to group for later fire 
     $aNotifiyGroup[] = $oNotify; 
    } 
    else 
    { 
     //Fire notification 
    } 
}  

//Fire Grouped notification 
foreach($aNotifyGroup as $oNotify) 
{ 
    //Fire 
} 
Смежные вопросы