Как я могу повысить производительность запросов в цикле, используя построитель запросов Laravel? - PullRequest
0 голосов
/ 19 сентября 2018

В настоящее время у меня есть 3 таблицы:

enter image description here

У клиента может быть тысяча счетов-фактур, и счет-фактура также может иметь тысячи платежей.

Мой текущий запрос выглядит так:

$invoices = DB::table('invoices')
        ->where('customer_id', $customer_id)
        ->get();

foreach ($invoices as $invoice) {
    // attach payments result to $invoice->all_payments
    $invoice->all_payments = DB::table('payments')
                                ->where('invoice_id', $invoice->id)
                                ->get();
}

Мой запрос работает, хотя и занимает много времени.Я ищу альтернативный способ сделать это с точки зрения производительности.

Мой предыдущий запрос с использованием соединения:

    $data = DB::table('invoices')
                ->join('payments', 'invoices.id', '=', 'payments.invoice_id')
                ->where('customer_id', $customer_id)
                ->get();

Есть ли лучший способ сделать это?Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Как насчет использования eloquent?

Invoice::with('payments')->where('customer_id', $customerId)->get();

Вам просто нужно добавить метод отношений в модель Invoice, например:

public function payments()
{
    return $this->hasMany('App\Model\Payment');
}
0 голосов
/ 19 сентября 2018

Вы должны попробовать это:

 $data = DB::table('invoices')
                ->join('payments', 'invoices.id', '=', 'payments.invoice_id')
                ->leftJoin('customers', 'invoices.customer_id', '=', 'customers.id')
                ->where('customer_id', $customer_id)
                ->get();
...