是否有可能在Laravel中以多对多关系获取与特定实例无关的所有项目?
示例:
我有两个模型,User
和Pet
。他们有很多关系,因为用户可以拥有许多宠物,但宠物可以属于更多用户。
但我想要一份特定用户没有的宠物清单。
这怎么可能?
EDIT 以上仅是一个示例,因此与我当前的任务无关。用户和宠物解释起来更简单。但要指明:
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
然后马丁有一只狗,一只兔子和一只老鼠。
但我想要一份他没有的宠物清单: 猫,马,蝙蝠和鸟
答案 0 :(得分:7)
你可以试试这个(你的问题对我来说听起来有些混乱):
$pets = Pet::with('users')->whereDoesntHave('users', function($query) use ($id) {
$query->where('user', $id);
})->get();
另外,试试这个(如果你想):
$pets = Pet::with('users')->whereHas('users', function($query) use ($id) {
$query->where('user', '!=', $id);
})->get();
答案 1 :(得分: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();
答案 2 :(得分:0)
如果您已经在模型上定义了ManyToMany关系,我会建议使用此方法:
$user = User::find($user_id);
$pets = new Pet;
$exception = $user->profile->pluck('id')->toArray();
$pets = $pets->whereNotIn('id',$exception)->get();