基于AND而不是OR查询Laravel多对多关系

时间:2017-10-06 03:06:15

标签: php mysql laravel laravel-5 laravel-5.5

我搜索过并搜索过,无法找到解决方法。我使用的是Laravel 5.5。

我有一个简单的3表系统设置,如下所示:

  • 产品
  • option_items
  • option_items_products 表(数据透视表)

产品型号 hasMany option_items option_items belongsToMany 产品

我可以同步并保存,一切都很好。

我甚至可以返回似乎有"或"的结果。运营商。含义...我可以找到所有产品 option_item.id 4或 option_item.id 5或 option_item.id 8

我想要做的是能够根据option_item过滤产品,因此我应该能够以某种方式完成所有 option_item.id 4 AND option_item.id 5 AND option_item.id 8

结果将更具体,但应更准确。

希望有人可以帮助解决如何查询的方向。我正在学习laravel,但只需要朝着正确的方向前进。

3 个答案:

答案 0 :(得分:0)

尝试使用雄辩的关系 https://laravel.com/docs/5.5/eloquent-relationships

类似这样的事情

Products::with(option_items)->whereHas('option_items', function ($q) {
            $q->where('id','==', 1);
        })->get();

使用选项项目的Id为1的选项项目获取产品;

答案 1 :(得分:0)

你可以这样做:

$optionIds = [2,1];
$users = Product::whereHas('optionItems',function ($q) use ($option_ids){
     $q->whereIn('option_items.id',$optionIds);
})->get();

它表明你在Product模型中有这样的关系:

public function optionItems()
{
     return $this->belongsToMany(OptionItem::class, 'option_items_products')
}

答案 2 :(得分:0)

试试这样:

   $idArray = array("1","2","3"...);
   $productList = Product::  
               //To check that records exists or not.              
                whereHas(
                'optionItems', function ($query)  use ($idArray){
                    $query->whereIn('id', $idArray);
                }
            )        
              //To fetch the matched records.
                ->with(
                    [
                        'optionItems' => function ($query) use ($idArray) {
                            $query->select('*')->whereIn('id', $idArray);
                        },
                    ]
                )
                ->get()
                ->toArray();