Laravel / MySQL /雄辩的:分组子句

时间:2018-09-17 02:02:25

标签: php mysql laravel

我在我的网站上具有搜索功能,用户可以在一定范围内按汽车的不同属性进行搜索。用户可以选择也可以不选择通过某个属性进行搜索。这些数组只是动态的,可以有0、1、2或3个条目,具体取决于选择的用途(因此查询必须是动态的),即:

$price_ranges = [
  [0, 1000],
  [1000, 2000],
  [2000, 3000]
];

$weight_ranges = [
  [1000, 2000],
  [5000, 9999]
]

我想在Laravel / Eloquent中使用querybuilder来为此构建一个合适的查询,但是在对子句进行分组时遇到了很多困难。这就是我所拥有的:

$query = Shipment::with(['cars']);

foreach($price_ranges as $price_range){
  $query->whereHas('cars', function($q) use(&$price_range){
    $q->where('price', '>=', $range[0])->where('price', '<=', $range[1]);
  });
}

foreach($weight_ranges as $weight_range){
  $query->whereHas('cars', function($q) use(&$weight_range){
    $q->where('weight', '>=', $range[0])->where('weight', '<=', $range[1]);
  });
}

$results = $query->get();

此代码的问题是,它正在查找具有满足每个价格条件的汽车的货运...但是我希望它查找满足任何的货运。 >条件,仅退还相关车辆。我创建了一个示意图,以更好地说明我要执行的操作:

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为您只需要用户orWhereHas或whereHas!但您需要将整个权重查询括起来,其中一个

$query = Shipment::with(['cars']);

foreach($price_ranges as $price_range){
  $query->orWhereHas('cars', function($q) use(&$price_range){
    $q->where('price', '>=', $range[0])->where('price', '<=', $range[1]);
  });
}

foreach($weight_ranges as $weight_range){
  $query->where(function($q) use(..) {
    $q->orWhereHas('cars', function($q) use(&$weight_range){
        $q->where('weight', '>=', $range[0])->where('weight', '<=', $range[1]);
    });
  });
}

$results = $query->get();

我可能完全错了,很久没有这样做了。请让我知道,祝你好运。