Laravel:获取多对多关系中不相关的项目

问题描述 投票:0回答:5

是否可以在 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

然后马丁养了一只狗、一只兔子和一只老鼠。

但我想要一份他没有的宠物清单: 猫、马、蝙蝠和鸟

php laravel laravel-5
5个回答
14
投票

你可以尝试这个(你的问题对我来说听起来有点令人困惑):

$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();

0
投票

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();

0
投票

如果您已经在模型上定义了多对多关系,我会建议使用此方法:

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

0
投票

我的解决方案:至少对我有用。

只需使用:

Pet::whereDoesntHave('user');

Pet::whereDoesntHave('user', function($qu) {
   // ...(extended query filter logic)
});

0
投票

此查询应该适合您的目的: $this->pets = Pet::whereDoesntHave('users', function ($query) use ($user) { $query->where('users.id', $user->id); })->get();

© www.soinside.com 2019 - 2024. All rights reserved.