проблема с сокращением времени открытия в laravel

#laravel #optimization

#laravel #оптимизация

Вопрос:

Я создаю отчет, в котором пользователь может проверять баланс по счету в течение дня, например, между 1-30 днями, сколько причитается. между 30-60 днями, Сколько причитается и т. Д. Для этого у меня есть функция make ниже.

Я не знаю, как я могу оптимизировать это время процесса.

 public function yajraAgingARSummaryByDueDate()
{
   $customerData = GenerateInvoice::select('orders.customer_id','customers.first_name', 'customers.last_name','customers.terms','customers.account_id','customers.account_suffix','invoice.due_date','invoice.invoice_number')
        ->leftJoin('orders','orders.id','=','invoice.order_id')
        ->leftJoin('customers', 'customers.id', 'orders.customer_id')
        ->whereDate('invoice.due_date','<=',date('Y-m-d'))
        ->whereNotNull('orders.customer_id')
        ->where('invoice.is_invoice_paid','=','no')
        ->whereNull('invoice.deleted_at')
        ->groupBy('orders.customer_id')
        ->get();

$resultArr = [];

if(count($customerData))
{
    foreach($customerData as $key => $row)
    {
        $current = 0;
        $b_1_30 = 0;
        $b_31_60 = 0;
        $b_61_90 = 0;
        $b_over_90 = 0;
        $total_ar = 0;
        $balance = 0;

        $invoiceData = GenerateInvoice::select('invoice.id')
                        ->leftJoin('orders','orders.id','=','invoice.order_id')
                        ->where('orders.customer_id',$row['customer_id'])
                        ->whereDate('invoice.due_date','<=',date('Y-m-d'))
                        ->whereNotNull('orders.customer_id')
                        ->whereNull('invoice.deleted_at')
                            ->where('invoice.is_invoice_paid','=','no')
                        ->get();
        
        if(count($invoiceData))
        {
            foreach($invoiceData as $row1)
            {
                $data = GenerateInvoice::select(DB::raw("abs(DATEDIFF(STR_TO_DATE(due_date, '%Y-%m-%d'),CURDATE())) AS Days"),'orders.total_order_value','payments.payment_amount')
                        ->selectRaw(' (select sum(auto_cash_distributions.payment_amount) from auto_cash_distributions where auto_cash_distributions.order_id = invoice.order_id and payment_amount is not null ) as acd_payament_amount ')
                        ->leftJoin('orders','orders.id','=','invoice.order_id')
                        ->leftJoin('payments','payments.order_id','=','orders.id')  
                        ->where('invoice.id',$row1['id'])
                        ->whereNotNull('orders.customer_id')
                        ->whereNull('invoice.deleted_at')
                        ->whereNull('payments.deleted_at')
                            ->where('invoice.is_invoice_paid','=','no')
                        // ->groupBy('payments.invoice_id')
                        ->first();

                $days = $data['Days'];

                $acd_payament_amount = !(empty($data['acd_payament_amount'])) ? $data['acd_payament_amount'] : 0;
                $payment_amount = $data['payment_amount']   $acd_payament_amount;
                $amount = $data['total_order_value'] - $payment_amount;

                // H 30/12
                $amount = $amount;
                $balance =$balance    $amount;

                $total_ar = $total_ar   $amount;
                // $total_ar = $amount;
                
                if($days>90)
                {
                    $b_over_90 = $b_over_90   $amount;
                }
                else if($days <=90 amp;amp; $days>=61)
                {
                    $b_61_90 = $b_61_90   $amount;
                }
                else if($days <=60 amp;amp; $days>=31)
                {
                    $b_31_60 = $b_31_60   $amount;
                }
                else if($days <=30 amp;amp; $days>=1)
                {
                    $b_1_30 = $b_1_30   $amount;
                }
                else
                {
                    $current = $current   $amount;
                }
            }
        }
        $resultArr[$key]['account_id'] = $row['account_id'];
        $resultArr[$key]['account_suffix'] = $row['account_suffix'];
        $resultArr[$key]['first_name'] = $row['first_name'];
        $resultArr[$key]['terms'] = $row['terms'];
        $resultArr[$key]['due_date'] = $row['due_date'];
        $resultArr[$key]['invoice_number'] = $row['invoice_number'];
        $resultArr[$key]['balance'] = number_format($balance,2,'.','');
        $resultArr[$key]['current'] = number_format($current,2,'.','');
        $resultArr[$key]['b_1_30'] = number_format($b_1_30,2,'.','');
        $resultArr[$key]['b_31_60'] = number_format($b_31_60,2,'.','');
        $resultArr[$key]['b_61_90'] = number_format($b_61_90,2,'.','');
        $resultArr[$key]['b_over_90'] = number_format($b_over_90,2,'.','');
        $resultArr[$key]['total_ar'] = number_format($total_ar,2,'.','');
    }
}
return Datatables::of($resultArr)
        ->addColumn('due_date',function($sql){
            return !empty($sql['due_date']) ? date(get_config('date_format'),strtotime($sql['due_date'])) : '';
        })
        ->addIndexColumn()
        ->rawColumns(['due_date'])
        ->make(true);
}
 

но для открытия этого кода требуется много времени. кто-нибудь может помочь мне оптимизировать этот код?

Комментарии:

1. Также опубликуйте структуру таблицы

2. @MayankPandeyz Спасибо за ваш ответ, но сложно опубликовать всю структуру таблицы, потому что существует так много соединений таблиц

3. Таблица GenerateInvoice содержит одну запись для каждой транзакции?

4. @MayankPandeyz да

5. В этом случае вам нужно создать 1 или 2 транзакционные таблицы, содержащие в них обобщенные данные, и выполнить задание CRON, которое обобщит эти данные и вставит в эти таблицы. Из этих таблиц транзакций вы можете легко извлекать данные без таких длительных задержек