Как получить модель, используя связанные с ней модели - PullRequest
0 голосов
/ 06 августа 2020

Я хочу создать одноранговый чат,

У меня есть три модели: 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

в псевдокоде то, что я пытаюсь получить, это это:

1 Ответ

0 голосов
/ 06 августа 2020

Вам необходимо запросить чат через отношение:

$chat = Chat::whereHas('users', function ($query) use ($user, $receiver) {
    return $query->whereIn('id', [$user->id, $receiver->id]);
})->get()->first();

Однако существует фундаментальная проблема с вашей структурой данных. У вас нет возможности отличить пользователя от получателя в вашей базе данных. Вместо этого вы должны передать идентификатор чата в запрос, и вы могли бы просто сделать что-то простое, например:

$chat = Chat::find($request->id);

См. Документы https://laravel.com/docs/7.x/eloquent-relationships#querying -relationship-exist

При доступе к записям для модели вы можете sh ограничить свои результаты на основании наличия связи. Например, представьте, что вы хотите получить все сообщения в блоге, содержащие хотя бы один комментарий. Для этого вы можете передать имя связи методам has и orHas.

Если вам нужно больше мощности, вы можете использовать whereHas и orWhereHas методов для помещения условий в ваши has запросы. Эти методы позволяют добавлять настраиваемые ограничения к ограничению отношения, например, проверять содержимое комментария

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...