第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Laravel 基于關(guān)系值的排序模型

Laravel 基于關(guān)系值的排序模型

PHP
慕尼黑5688855 2023-11-03 10:49:14
我有一個(gè)名為“業(yè)務(wù)”的模型,一個(gè)企業(yè)可以提供多種服務(wù)。我有另一種模型,稱為“付款”。付款記錄了人們支付的服務(wù)費(fèi)用。一項(xiàng)服務(wù)可以有多個(gè)付款。我打算根據(jù)收到的付款獲取排名前 10 名和排名最差的 10 家企業(yè)。下面的代碼工作正常,但效率很低。我必須循環(huán)遍歷整個(gè)數(shù)據(jù)才能檢索我需要的信息。有更有效的方法來實(shí)現(xiàn)這一目標(biāo)嗎?$businesses = Business::with(['services'])->get();foreach($businesses as $business){    $id = $business->id;    $name = $business->display_name;    $services = $business->services;    $businessRevenue = 0;    if(count($services)>0){        foreach($services as $service){            $serviceId = $service->id;            $totalAmount = PaymentTransaction::whereHas('invoice', function($query) use ($serviceId){                $query->where('product_code_id', $serviceId);            })->where('amount_paid', ">", 0)->sum('amount_paid');            $businessRevenue= $businessRevenue + $totalAmount;        }    }    $businessArray = (object) array('id'=> $id, 'name'=> $name, 'revenue'=> $businessRevenue);        array_push($transformedBusiness, $businessArray);}$topBusiness = $bottomBusiness = $transformedBusiness;usort($bottomBusiness, function($a, $b) {return strcmp($a->revenue, $b->revenue);});usort($topBusiness, function($a, $b) {return strcmp($b->revenue, $a->revenue);});$topBusiness = array_slice($topBusiness, 0, 10);$bottomBusiness = array_slice($bottomBusiness, 0, 10);return view('report.department_performance', compact('topBusiness', 'bottomBusiness'));
查看完整描述

1 回答

?
慕森卡

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊

我想您可以使用聯(lián)接查詢直接從數(shù)據(jù)庫獲取排名前 10 的企業(yè)和排名最低的 10 家企業(yè),而不是循環(huán)所有企業(yè)記錄并手動(dòng)計(jì)算其收入


對(duì)于排名前 10 的業(yè)務(wù),您可以對(duì)其余相關(guān)表使用內(nèi)部聯(lián)接


$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();

對(duì)于最低 10 個(gè)業(yè)務(wù),請(qǐng)使用發(fā)票和 payment_transaction 的左聯(lián)接,這樣,如果這些表中沒有某個(gè)業(yè)務(wù)的記錄,您仍然可以獲得這些業(yè)務(wù)記錄


$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合并函數(shù)在返回 null 的情況下顯示 0 值sum(),如果您使用任何其他數(shù)據(jù)庫,您可以使用備用函數(shù)。


查看完整回答
反對(duì) 回復(fù) 2023-11-03
  • 1 回答
  • 0 關(guān)注
  • 165 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)