我在laravel中有一对多的关系:
如何按产品最低价格获得$ types订单?
示例:
因此类型应按顺序排列:type_1,type_3,type_2。
我尝试过:
$types = $types->whereHas('products', function($q) use($order_by_price){
$q->orderBy('price', $order_by_price);
});
但是没有用。
我也尝试了join(),但是它以某种方式破坏了集合。可能是因为类型和产品表中的列名称相同。
答案 0 :(得分:1)
就做
$type->products()->orderBy('price')->get();
或
Product::orderBy('price')->get();
如果您想获得更详细的答案,请共享更多代码(模型,控制器等),以便我知道如何使用不同的模型/解决方案
答案 1 :(得分:1)
由于您具有一对多的关系,因此需要进行汇总。我发现以另一种方式进行处理比较容易,即将所有产品按类型和订单按最低价格分组。
$types = Product::with('type')->groupBy('type_id')
->select('type_id', \DB::raw('MIN(price) as minPrice'))
->orderBy('minPrice')
->get()
->pluck('type');
这假定您具有在产品中定义的名称为“ type”的类型关系。
答案 2 :(得分:0)
首先,您收集所有过滤器并将它们一起应用。您可以执行以下操作。
$min_price = request('min_price');
$max_price = request('max_price');
$order_by_price = request('order_by_price');
$types = Type::whereIn('category_id', $type_categories)->whereHas('products', function ($q) use ($min_price, $max_price, $order_by_price) {
if (!is_null($min_price)) {
$q->where('price', '>=', $min_price);
}
if (!is_null($max_price)) {
$q->where('price', '<=', max_price);
}
if (!is_null($order_by_price)) {
$q->orderBy('price', $order_by_price);
}
})->paginate(9);