Поскольку вы используете один ко многим.
Решение 1:
Вы можете использовать with
и groupBy
, выглядя так:
$invoice = Invoice::with(['invoice_items' => function($query){
$query->groupBy('invoice_id')->select('invoice_id', DB::raw('SUM(amount) AS amount_sum'));
}])->get();
Решение 2:
Или вы можете использовать leftjoin
и SUM
, выглядящие так:
$invoice_query = InvoiceItem::groupBy('invoice_id')->select("invoice_id", DB::raw('SUM(amount) AS amount_sum'));
Invoice::leftjoin(DB::raw("({$invoice_query->toSql()}) AS ii"), 'ii.invoice_id', '=', 'invoices.id')
->mergeBindings($invoice_query->getQuery())
->select('invoices.*', 'amount_sum')
->get();
Решение 3:
Использование accessor : В вашей модели счета-фактуры:
protected $appends = ['amount_sum'];
public function getAmountSumAttribute()
{
return $this->invoice_items()->where('invoice_id', $this->id)->sum('amount');
}
ТАК, что вы можете просто получить сумму:
Invoice::all()->toJSON();