我在我的网站上具有搜索功能,用户可以在一定范围内按汽车的不同属性进行搜索。用户可以选择也可以不选择通过某个属性进行搜索。这些数组只是动态的,可以有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();
此代码的问题是,它正在查找具有满足每个价格条件的汽车的货运...但是我希望它查找满足任何的货运。 >条件,仅退还相关车辆。我创建了一个示意图,以更好地说明我要执行的操作:
答案 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();
我可能完全错了,很久没有这样做了。请让我知道,祝你好运。