Я прочитал все ответы, но все еще не получил ответ, который ищу. Здесь позвольте мне объяснить, что у меня есть, и я сделал до сих пор.
Я создал приложение для чата, в котором пользователь может иметь двойной или групповой чат. у меня следующая структура базы данных:
chatrooms
id | creator_id (who created chatroom) | type (duo/group) | group_id (if chatroom type is 'group')
messages
id | chatroom_id | senders_id | recipient_id | message | read(by default 0)
У меня есть еще одна таблица для отслеживания участников чата
chatroom_user
id | chatroom_id | user_id
Теперь все работает нормально для чатов типа дуэт. Я получаю количество непрочитанных сообщений для двойного чата, выполнив этот запрос:
return auth()->user()
->chatrooms()
->withCount(['messages' => function (Builder $query) {
$query->where('read', 0)->where('recipient_id', auth()->user()->id);
}])
->get();
И это прекрасно работает :)
Но теперь, если у меня есть групповой чат, у меня несколько получателей. я не могу сделать то, что сделал выше. Итак, я создал еще одну сводную таблицу
message_recipient
id | message_id | recipient_id | read
Теперь я могу отслеживать непрочитанные сообщения для указанного пользователя c. Но проблема в том, что когда я сохраняю сообщение, мне нужно добавить сюда столько строк, сколько получателей и сколько для каждого сообщения. Предположим, у меня есть группа из 10 человек, если кто-то отправит сообщение «привет», мне нужно поместить 10 записей в эту таблицу (на самом деле 10-1). Итак, мой вопрос: это будет проблема производительности? Есть ли лучший способ справиться с такой ситуацией?