亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

優化 Laravel 查詢

優化 Laravel 查詢

PHP
MYYA 2023-07-08 20:52:38
我正在開展一個項目,需要以 Excel 格式導出產品銷售報告。我正在使用Maatwebsite/Laravel-Excel我有三個模型。產品.phpclass products extends Model{? ? protected $table='products';? ? public $timestamps = false;? ? protected $fillable? = ['image', 'asin','price','strategy_id'];? ? public function orderDetails()? ? {? ? ? ? return $this->hasMany(order_details::class, 'SKU', 'asin');? ? }}訂單.phpclass orders extends Model{? ? protected $table = 'orders';? ? public $timestamps = false;? ? protected $fillable = ['id','date','quantity','totalAmount'];? ? public function orderDetails()? ? {? ? ? ? return $this->hasMany(order_details::class);? ? }}訂單詳細信息.phpclass order_details extends Model{? ? protected $table = 'order_details';? ? protected $fillable = ['id','order_id','SKU','unitPrice','quantity','totalPrice'];? ? public function order()? ? {? ? ? ? return $this->belongsTo(orders::class);? ? }現在我想計算每個產品在過去 30 天、60 天和 90 天的銷售次數。注意事項產品.asin = order_detils.SKUorder_detail 表沒有訂單日期列。一個訂單可以有多個產品,且數量大于1。我當前的查詢是:-$products = products::query();// Some where clauses/filters$products = $products->get();foreach($products as $product){? ? // Getting the order_details which has this product? ? $orderIds = order_details::where('SKU','=',$product->asin)->pluck('order_id');? ? $product->sales30days = orders::whereIn('id', $orderIds)->whereBetween('date', [Carbon::now()->subDays(30), Carbon::now()])->sum('quantity');? ? $product->sales60days = orders::whereIn('id', $orderIds)->whereBetween('date', [Carbon::now()->subDays(60), Carbon::now()])->sum('quantity');? ? $product->sales90days = orders::whereIn('id', $orderIds)->whereBetween('date', [Carbon::now()->subDays(90), Carbon::now()])->sum('quantity');? ? $product->sales120days = orders::whereIn('id', $orderIds)->whereBetween('date', [Carbon::now()->subDays(120), Carbon::now()])->sum('quantity');? ? $product->totalSold = orders::whereIn('id', $orderIds)->sum('quantity');}上面的查詢給出了我需要的結果,但需要花費大量時間并且性能不友好。我有超過 100k 個產品。我有什么解決方案來優化這個查詢嗎?$products->paginate(100)我可以在 foreach 循環之后添加分頁嗎?
查看完整描述

1 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

問題是您要進行很多查詢,并且速度不可避免地會很慢。該解決方案應該具有更好的性能,因為您只進行了兩次查詢。


$orders = orders::with(['orderDetails'])->get();

$now = Carbon::now();

$quantities = [];


foreach($orders as $order) {

    $daysOld = $order->date->diffInDays($now);


    foreach ($order->orderDetails as $details) {

        if (!isset($quantities[$details->SKU])) {

            $quantities[$details->SKU]['30'] = 0;

            $quantities[$details->SKU]['60'] = 0;

            $quantities[$details->SKU]['90'] = 0;

            $quantities[$details->SKU]['120'] = 0;

            $quantities[$details->SKU]['total'] = 0;

        }


        if ($daysOld <= 30) {

            $quantities[$details->SKU]['30'] += $details->quantity;

        }


        if ($daysOld <= 60) {

            $quantities[$details->SKU]['60'] += $details->quantity;

        }

        

        if ($daysOld <= 90) {

            $quantities[$details->SKU]['90'] += $details->quantity;

        }


        if ($daysOld <= 120) {

            $quantities[$details->SKU]['120'] += $details->quantity;

        }


        $quantities[$details->SKU]['total'] += $details->quantity;

    }

}


return products::all()->map(function ($product) use ($quantities) {

    $product->sales30days  = $quantities[$product->asin]['30'];

    $product->sales60days  = $quantities[$product->asin]['60'];

    $product->sales90days  = $quantities[$product->asin]['90'];

    $product->sales120days = $quantities[$product->asin]['120'];

    $product->salesTotal   = $quantities[$product->asin]['total'];


    return $product;

}); 


查看完整回答
反對 回復 2023-07-08
  • 1 回答
  • 0 關注
  • 155 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號