我的网站上有搜索功能,用户可以在一定范围内按汽车的不同属性进行搜索。用户可以选择也可以不选择通过某个属性进行搜索。这些数组只是动态的,可以有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();


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

php - Laravel/MySQL/ Eloquent :分组子句-LMLPHP

最佳答案

我认为您只需要使用“用户”或“何处拥有”或“何处拥有”!但您需要将整个权重查询包装为一个

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


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

关于php - Laravel/MySQL/ Eloquent :分组子句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52359922/

10-16 14:43