Laravel收集顺序按关系列

时间:2019-03-18 15:47:52

标签: php mysql laravel eloquent

我在laravel中有一对多的关系:

  1. 类型
  2. 产品-type_id,价格

如何按产品最低价格获得$ types订单?

示例:

  • type_1具有:product_x-10€,product_y-15€
  • type_2具有:product_a-20€,product_b-100€
  • type_3有:product_e-12€,product_f-200€

因此类型应按顺序排列:type_1,type_3,type_2。

我尝试过:

$types = $types->whereHas('products', function($q) use($order_by_price){
            $q->orderBy('price', $order_by_price);
        });

但是没有用。

我也尝试了join(),但是它以某种方式破坏了集合。可能是因为类型和产品表中的列名称相同。

Here you got screenshot

3 个答案:

答案 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);
相关问题