如何使用Laravel的查询构建器提高循环查询的性能?

时间:2018-09-19 05:04:20

标签: php laravel query-builder laravel-query-builder laravel-facade

目前,我有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 :(得分:0)

您应该尝试以下操作:

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

答案 1 :(得分:0)

如何善于口才?

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

您只需要在Invoice模型中添加关系方法,如下所示:

public function payments()
{
    return $this->hasMany('App\Model\Payment');
}