Отношение ко многим.Как искать одну общую для 2 коллекций? - PullRequest
0 голосов

У меня есть отношения многие ко многим в моем проекте.Пользователь принадлежит ToMany чаты и чат принадлежит Пользователям ToMany.

Итак, у меня есть сводная таблица chat_user с chat_id и user_id.

Один чат может включать в себя также некоторых пользователей

Это нормально иработает хорошо.

Когда я создаю новый чат, у меня есть 2 пользователя.И я хочу проверить, есть ли между ними общий чат.

У меня есть некоторые проблемы с этим запросом.Я также пытался создать пользовательскую модель на столе chat_user ... но не повезло = (Может быть, кто-то проделал такую ​​работу? Есть какие-нибудь практики? Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Одним из способов является использование метода построителя запросов whereHas () :

$user1->chats()->whereHas('users', function($q) use ($user2) {
    $q->where('user_id', '=', $user2->id);
})->get();

В качестве передового опыта я лично хотел бы объединить нечто подобное с моделью (в этомв случае вашей модели чата) как область запроса для более легкого использования:

// class App\Chat
public function scopeWithUser($query, User $user)
{
    $query->whereHas('users', function ($q) use ($user) {
        $q->where('user_id', '=', $user->id);
    });
}

Затем вы можете использовать его следующим образом:

// get common chats between user1 and user2
$user1->chats()->withUser($user2)->get();

// see if a common chat exists
$user1->chats()->withUser($user2)->exists();

, который я считаюочень читабельный.

0 голосов
/ 25 мая 2018

Самый простой способ - это просто взять одного пользователя и поискать другого.Предполагая, что ваши отношения правильные, что-то вроде этого:

$firstUserChats = $firstUser->chats()->pluck('user_id');
$usersHaveACommonChat = $firstUserChats->contains($secondUser->id);

Хотя есть способы сделать это в одной строке, обычно это так же просто, как и получается.:)

...