Я разрабатываю приложение для приватного чата, в котором настроены таблицы, как показано на рисунке ниже.
Для поддержки группового чата я сделал так, чтобы между беседами и пользователями существовала связь «многие ко многим» (разговор_пользователь). Это позволяет мне связывать / добавлять пользователей к беседам, не ограничивая его только двумя пользователями на беседу (sender_id, receient_id и c).
Для создания беседы ДОЛЖНЫ быть отправитель и получатель. , После инициализации беседы с этими двумя пользователями к беседе можно добавить больше пользователей.
Мой вопрос
Как проверить, существует ли существующая беседа который включает в себя отправителя и получателя.
То, что я пробовал
Это явно неправильный способ go, потому что это не дает мне желаемых результатов, но я пытаюсь найти любой экземпляр, в котором идентификаторы отправителя и получателя, которых я передаю, используют один и тот же идентификатор разговора. ПРИМЕЧАНИЕ: моя таблица 'разговор_пользователя' названа 'участниками' в модели разговора. Я также предпочел бы получать соответствующие подробности из разговора, а не пользователей, которые я уже знаю, как это сделать.
$existingConversation = Conversation::whereHas('participants')->with(['participants' => function($query) use ($request) {
$query->where('user_id', $request->recipient_id);
}])
->whereHas('participants')->with(['participants' => function($query) use ($request) {
$query->where('user_id', $request->sender_id);
}])->groupBy('id')->get();
Пример сценария
У меня есть приведенные ниже записи в моей таблице базы данных.
Бэкэнд получает sender_id: 1
и recipient_id: 3
от внешнего интерфейса. Запрос выполняется для поиска ЛЮБЫХ разговоров, в которых участвуют отправитель и получатель. В этом случае он должен вернуть присоединяющийся диалог 33
.