Я хочу создать одноранговый чат,
У меня есть три модели: ChatMessage, чат и модель пользователя, чат и модель пользователя имеют отношения «многие ко многим», я создал сводную точку table 'chat_user' и определил ownToMany на обеих моделях.
когда пользователь инициирует чат, он получает userId и Id получателя, вот функция:
public function InitSingleChat(Request $request)
{
$user = auth()->user();
$receiver = User::findOrFail($request->receiver_id);
if ($user) {
if ($receiver) {
$chat = Chat::find([$user -> id, $receiver -> id])->first();
if ($chat) {
return response()->json(['channel' => "private-chat-" . $chat->id, 'chat' => $chat]);
} else {
$chat = new Chat();
$chat -> save();
$chat -> users() -> attach($user);
$chat -> users() -> attach($receiver);
return response()->json(['channel' => "private-chat-" . $chat->id, 'chat' => $chat]);
}
} else {
return response()->json('Receiver not found', 404);
}
} else {
return response()->json('You are not signed in', 401);
}
}
*
Идея состоит в том, чтобы сначала выяснить, имеют ли два идентификатора пользователя общую модель чата, если нет, он создает новый чат и присоединяет обоих пользователей к одному чату и возвращает идентификатор чата, иначе он возвращает идентификатор чата.
этот блок $chat = Chat::find([$user -> id, $receiver -> id])->first();
, однако всегда возвращает весь чат с идентификатором, связанным с первым идентификатором пользователя, т.е. ($ user -> id).
На самом деле я хотел найти чат, в котором есть точно два userIds в своей коллекции или создайте новый, если он не существует.
Я также пробовал $chat = Chat::whereIn('id', [$user -> id,$receiver -> id])->get()
Это работало как оператор Or, но требовалось выражение AND
в псевдокоде то, что я пытаюсь получить, это это: