【问题标题】:Laravel: Get not related items in a many to many relationLaravel:在多对多关系中获取不相关的项目
【发布时间】:2016-02-20 20:59:56
【问题描述】:

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

例子:

我有两个模型,UserPet。它们具有多对多关系,因为一个用户可以拥有许多宠物,但一只宠物可以属于更多用户。

但我想要一个特定用户没有的宠物列表。

这怎么可能?

编辑 以上只是一个例子,与我当前的任务无关。只是更简单地向用户和宠物解释。但要指定:

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 桌子怎么样?
  • 你能举一个特定用户没有的宠物列表的例子吗?

标签: php laravel laravel-5 laravel-5.2


【解决方案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();

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我试过这个,但它不适用于我的情况。这个想法是只显示那些不是数据透视表但我看到所有表记录的记录
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 2015-04-05
      • 2017-12-19
      相关资源
      最近更新 更多