Laravel: получить несвязанные элементы в отношении многие ко многим

Можно ли получить все элементы, не относящиеся к конкретному экземпляру, в отношении «многие ко многим» в Laravel?

Пример:

У меня две модели, User и Pet. У них есть отношения «многие ко многим», потому что у пользователя может быть много домашних животных, но домашнее животное может принадлежать большему количеству пользователей.

Но мне нужен список питомцев, которых нет у конкретного пользователя.

Как такое возможно?

ИЗМЕНИТЬ Вышеупомянутое - это просто пример, не связанный с моей текущей задачей. Еще проще объяснить пользователям и домашним животным. Но указать:

PETS TABLE:
ID TYPE
1  Dog
2  Cat
3  Rabit
4  Horse
5  Rat
6  Bat
7  Bird

USERS TABLE:
ID NAME
1  Martin
2  Peter
3  Viggo

PET_USER TABLE:
ID PET USER
1  1   1
2  3   1
3  5   1

Затем у Мартина есть собака, кролик и крыса.

Но мне нужен список домашних животных, которых у него нет: кошка, лошадь, летучая мышь и птица.


person mschadegg    schedule 20.02.2016    source источник
comment
Как выглядит ваш pets стол?   -  person Jilson Thomas    schedule 21.02.2016
comment
Можете привести пример списка питомцев, которых нет у конкретного пользователя.   -  person oseintow    schedule 21.02.2016


Ответы (3)


Вы можете попробовать это (ваш вопрос кажется мне немного запутанным):

$pets = Pet::with('users')->whereDoesntHave('users', function($query) use ($id) {
    $query->where('users.id', $id);
})->get();

Также попробуйте это (если хотите):

$pets = Pet::with('users')->whereHas('users', function($query) use ($id) {
  $query->where('users.id', '!=', $id);
})->get();
person The Alpha    schedule 20.02.2016

В laravel нет функции для запуска этого из коробки.

Вы должны присоединиться к этому вручную:

$pets = Pet::leftJoin('pet_user', function($join) use ($userId){
        $join->on('pets.id', '=', 'pet_user.pet_id');
        $join->on('pet_user.user_id', '=', \DB::raw("'".$userId."'"));
    })->whereNull('pet_user.pet_id')->get();
person Flip    schedule 18.07.2017
comment
Я пробовал это, но в моем случае это не работает. Идея состоит в том, чтобы показать только те, которые не являются сводной таблицей, но я вижу все записи таблицы. - person user agent; 06.06.2018

Я бы предложил этот метод, если вы уже определили отношение ManyToMany в своих моделях:

$user = User::find($user_id);
$pets = new Pet;
$exception = $user->profile->pluck('id')->toArray();
$pets = $pets->whereNotIn('id',$exception)->get();
person Alpha6572    schedule 06.02.2020