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

时间:2016-02-20 20:59:57

标签: php laravel laravel-5 laravel-5.2

是否有可能在Laravel中以多对多关系获取与特定实例无关的所有项目?

示例:

我有两个模型,UserPet。他们有很多关系,因为用户可以拥有许多宠物,但宠物可以属于更多用户。

但我想要一份特定用户没有的宠物清单。

这怎么可能?

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
然后马丁有一只狗,一只兔子和一只老鼠。

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

3 个答案:

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