Таким образом, хотя это может иметь смысл иметь отношение, что уведомления есть много пользователей, это действительно Безразлично» t имеет смысл от владения. Уведомления являются разовыми вещами, в то время как пользователи сохраняют в некотором смысле. Поэтому старайтесь думать о пользователях как о базовом объекте и уведомлениях как о богатом ресурсе.
Целью здесь является получение уведомлений пользователей, поэтому из этого вы должны выбрать, нужно ли дублировать уведомления для каждого пользователя или иметь одно уведомление для многих пользователей. В одном случае, когда это универсальные уведомления (возможно, панель администратора), а другая - уведомления, которые являются персональными для пользователя. Если вы делаете последнее, вам не нужна сводная таблица и только таблица уведомлений.
User -> hasOne -> Notification
Notification -> belongsTo -> User
Это позволяет реально настроить уведомления, которые, для каждого пользователя, чем полагаться на, может быть другой таблицы для чтения уведомлений вы можете просто пометить его как «читать» в строке.
Если вам нужны универсальные уведомления, структура просто реализует третий стол, который называется pivot, как вы знаете. (Я заметил, у вас есть имена классов множественных, которые не рекомендуются)
User -> Notification_User -> Notification
Для удобства вы также можете просто мягкой удалить в notification_user строку или уведомления сами. Вы можете просто сказать -> withTrashed() -> limit (x), чтобы получать предыдущие уведомления.
Это действительно упрощает работу, выполняемую БД и вашим кодом. Личные уведомления позволяют вам создавать, обновлять и обрабатывать чтение двумя способами: с мягким удалением и переменными IsRead.
Ваш код будет таким же простым, как этот.
Auth::user()->notifications()
Ваш класс Пользователь имеет следующие (предполагая, что стандартные схемы именования)
public function notifications()
{
//You're free to append other requirements here
return $this->hasMany('App\Notification','id','user_id');
}
Класс Уведомление имеет обратную
public function user()
{
//You're free to append other requirements here
return $this->belongsTo('App\User','user_id','id');
}
Если по какой-то причине вам требуется знать все непрочитанные уведомления повсеместно запрашивать таблицу уведомлений.
Notification::where('isRead','null')->get();
В качестве альтернативы вы можете ленивых нагрузка пользователи для каждого уведомления или групп пользователей в данном случае для любых целей вам нужно.
Если это помогло вам в решении, можете ли вы пометить его как ответ?
Я получаю следующее сообщение об ошибке, SQLSTATE [42S22]: Column не найдено: 1054 Неизвестный столбец 'is_read' в 'где предложение' (SQL: SELECT * FROM 'notifications' где (SELECT COUNT (*) из' user' inner join 'notification_user' на' users'.'id' = 'notification_user'.'user_id' где' notification_user'.'notification_id' = 'уведомления'.' '')> = 1 и 'is_read' = 0) который я предполагаю, потому что он ищет is_read в таблице уведомлений, а не в таблице notification_user – Udders
Вы можете указать таблицу: '-> где ('notification_user.is_read'' –