laravel - 按最高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 的零件并按可用数量对零件进行排序
解决方案
你可以这样订购:
$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)
推荐阅读
- java - ExchangeFilterFunction 在 WebClient 反应流之外执行代码?
- pandas - 将文本文件转入 Excel
- xml - 每个之后的 XSL 总和值
- sql - R中的计数间隔
- java-8 - 重置 picocli 选项字段
- assembly - 为什么调用函数时参数在堆栈上以这种方式排列?
- python-3.x - 在相似的 pk DataFrame 中制作项目列表
- node.js - 使用 Sequilize 和 async/await 以正确的顺序在 Node.js 中查找/创建记录
- aws-certificate-manager - Amazon Certificate Manager:我的最短可能域名太长
- django - 如何在 Django 2.2/Python 3.5 中基于模型字段定义权限