I have two models InvoiceHeader and InvoiceDetail. InvoiceHeader has the following attributes (among others): id, pos_id, pos_description and date. InvoiceHeader has the following attributes (among others): id, invoice_header_id, pct, price. There is a One To Many relationship between the two models.
I would like to group by pos_id and date from InvoiceHeader and by pct from InvoiceDetail. And with that I would like to get the sum of the price.
From what I found it is not possible to group by both models at once since no actual joins are being made with Eloquent. So I figured that I could group by the pct attribute on the InvoiceDetail. I do something like this:
$invoices = \App\InvoiceHeader::with(['details' => function ($query) {
$query->select('pct')
->selectRaw('SUM(price) AS price)
->groupBy(['invoice_header_id', 'pct']);
}])
->whereBetween('date', ['2018-01-01', '2018-07-31'])
->select(['pos_id', 'pos_description', 'date'])
->get();
And it is here that I am stuck. I would need to group by pos_id, pos_description on InvoiceHeader and group by pct on InvoiceDetail.
From here on I am taking a route, which I think is not the best / easiest one. However, since it is the only one that got me a bit closer to what I got I figured I could get on with it. If someone has a better suggestion, please do share.
I make a Laravel collection from the Eloquent collection as such:
$collection = collect();
foreach ($invoices as $invoice) {
foreach ($invoice->details as $detail) {
$collection->push([
'pos_id' => $invoice->pos_id,
'pos_description' => $invoice->pos_description,
'date' => $invoice->date,
'pct' => $detail->pct,
'price' => $detail->price,
]);
}
}
This brings me to something like
$collection = [
[
'pos_id' => 1,
'pos_description' => 'Somewhere',
'date' => '2018-02-28',
'pct' => 6,
'price' => 68.94
], [
'pos_id' => 1,
'pos_description' => 'Somewhere',
'date' => '2018-02-28',
'pct' => 21,
'price' => 99.99
], [
'pos_id' => 1,
'pos_description' => 'Somewhere',
'date' => '2018-02-28',
'pct' => 21,
'price' => 82.64
], [
'pos_id' => 1,
'pos_description' => 'Somewhere',
'date' => '2018-03-31',
'pct' => 21,
'price' => 431.45
]
]
This is where I want to get at, or something similar:
$newCollection = [
[
'pos_id' => 1,
'pos_description' => 'Somewhere',
'date' => '2018-02-28',
'details' => [
[
'pct' => 6,
'price' => 68.94
], [
'pct' => 21,
'price' => 182.63
]
]
], [
'pos_id' => 1,
'pos_description' => 'Somewhere',
'date' => '2018-03-31',
'details' => [
[
'pct' => 21,
'price' => 431.45
]
]
]
]
I tried many functions from the laravel docs use each, groupBy, map on the collection. Also got somewhere from this link. But I don't seem to be able to get what I want to accomplish. I feel like I am missing some easy steps which makes me do things too difficult.
Disclaimer: Most of the code is loosely based on working code. To simplify things I simplified some things.
via Chebli Mohamed
Aucun commentaire:
Enregistrer un commentaire