首页 > 解决方案 > 按最高hasmany排序

问题描述

我有两张桌子零件有很多优惠。

我需要按提供最高价格或数量排序的所有零件,其中提供价格 > 0 并且提供数量 > 0。

价格和数量是计算字段。

如何做到这一点?

我试过了

Part::
addSelect([
  'quantity' => Offer::select('quantity')
    ->orderBy('quantity', 'desc')
    ->whereColumn('part_id', 'parts.id')
    ->limit(1)
])
->orderBy('quantity', 'desc')
->paginate(3)

但这样我就不能按数量 > 0 和价格 > 0 过滤零件

另外,因为当我这样做时,数量是计算字段

->addSelect([
    'qty' => Offer::select(['quantity * 2 as qty'])
        ->orderBy('qty', 'asc')
        ->whereColumn('part_id', 'parts.id')
        ->limit(1)
])

我得到参考'数量'不支持错误

更多解释:

每个部分都有许多优惠。每个优惠都有许多运输。报价

available_quantity = quantity - sum of shipped quantities

我需要显示可用数量 > 0 的零件并按可用数量对零件进行排序

标签: laraveleloquent

解决方案


你可以这样订购:

$shipping = Shipping::groupBy('offer_id')->select(DB::raw('SUM(quantity) AS sum_quantity'), 'offer_id', 'id');

Part::join('offers', 'offers.part_id', '=', 'parts.id')
    ->join(DB::raw("({$shipping->toSql()}) AS ship"), 'ship.offer_id', '=', 'offers.id')
    ->select('parts.*',DB::raw('MAX(offers.quantity - ship.sum_quantity) AS avaliable_quantity'))
    ->groupBy('part.id')
    ->orderBy('avaliable_quantity', 'desc')
    ->paginate(3)

推荐阅读