1 回答
TA贡献1806条经验 获得超8个赞
我想您可以使用联接查询直接从数据库获取排名前 10 的企业和排名最低的 10 家企业,而不是循环所有企业记录并手动计算其收入
对于排名前 10 的业务,您可以对其余相关表使用内部联接
$topBusinesses = DB::query()
->select('b.id', 'b.display_name', DB::raw('sum(p.amount_paid) as revenue')
->from('business as b')
->join('service as s', 'b.id', '=', 's.business_id')
->join('invoice as i', 's.id', '=', 'i.product_code_id')
->join('payment_transaction as p', function ($join) {
$join->on('p.id', '=', 'i.payment_transaction')
->where('p.amount_paid', '>', 0);
})
->groupBy('b.id', 'b.display_name')
->orderByDesc('revenue')
->limit(10)
->get();
对于最低 10 个业务,请使用发票和 payment_transaction 的左联接,这样,如果这些表中没有某个业务的记录,您仍然可以获得这些业务记录
$lowestBusinesses = DB::query()
->select('b.id', 'b.display_name', DB::raw('coalesce(sum(p.amount_paid),0) as revenue')
->from('business as b')
->join('service as s', 'b.id', '=', 's.business_id')
->leftJoin('invoice as i', 's.id', '=', 'i.product_code_id')
->leftJoin('payment_transaction as p', function ($join) {
$join->on('p.id', '=', 'i.payment_transaction')
->where('p.amount_paid', '>', 0);
})
->groupBy('b.id', 'b.display_name')
->orderBy('revenue')
->limit(10)
->get();
我使用 MySQL合并函数在返回 null 的情况下显示 0 值sum(),如果您使用任何其他数据库,您可以使用备用函数。
- 1 回答
- 0 关注
- 109 浏览
添加回答
举报