是否可以在 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
然后马丁养了一只狗、一只兔子和一只老鼠。
但我想要一份他没有的宠物清单: 猫、马、蝙蝠和鸟
你可以尝试这个(你的问题对我来说听起来有点令人困惑):
$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();
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();
如果您已经在模型上定义了多对多关系,我会建议使用此方法:
$user = User::find($user_id);
$pets = new Pet;
$exception = $user->profile->pluck('id')->toArray();
$pets = $pets->whereNotIn('id',$exception)->get();
我的解决方案:至少对我有用。
只需使用:
Pet::whereDoesntHave('user');
或
Pet::whereDoesntHave('user', function($qu) {
// ...(extended query filter logic)
});
此查询应该适合您的目的: $this->pets = Pet::whereDoesntHave('users', function ($query) use ($user) { $query->where('users.id', $user->id); })->get();