问题
I am not getting the desired result from a collection with sum. Here is my controller code :
$query2 = DB::table('token')
->whereDate('token.date','>=',$request->fdate)
->whereDate('token.date','<=',$request->tdate)
->select('date',DB::raw('date(date) as cdate'),
DB::raw('token as refno'),
DB::raw("(case when gate = 'IN' and type='CAR' then date else null end) as intime"),
DB::raw("(case when gate = 'OUT' and type='CAR' then date else null end) as outtime"),
DB::raw("(case when gate = 'OUT' and type='CAR' then amount else 0 end) as amount"))
->orderBY('cdate')->get();
info($query2);
// need help for this query
$query = $query2->groupBy('refno')->map(function ($row) {
return $row->sum('amount');
})->all();
info($query);
The result from $query2 is :
[{"date":"2019-08-08 14:11:14","cdate":"2019-08-08","refno":1,"intime":"2019-08-08 14:11:14","outtime":null,"amount":0},{"date":"2019-08-08 14:11:22","cdate":"2019-08-08","refno":2,"intime":"2019-08-08 14:11:22","outtime":null,"amount":0},{"date":"2019-08-08 14:11:28","cdate":"2019-08-08","refno":3,"intime":"2019-08-08 14:11:28","outtime":null,"amount":0},{"date":"2019-08-08 14:12:03","cdate":"2019-08-08","refno":4,"intime":"2019-08-08 14:12:03","outtime":null,"amount":0},{"date":"2019-08-08 14:16:23","cdate":"2019-08-08","refno":1,"intime":null,"outtime":"2019-08-08 14:16:23","amount":50},{"date":"2019-08-08 14:16:27","cdate":"2019-08-08","refno":3,"intime":null,"outtime":"2019-08-08 14:16:27","amount":0},{"date":"2019-08-08 14:16:31","cdate":"2019-08-08","refno":4,"intime":null,"outtime":"2019-08-08 14:16:31","amount":50},{"date":"2019-08-08 14:16:33","cdate":"2019-08-08","refno":5,"intime":null,"outtime":"2019-08-08 14:16:33","amount":50}]
The result for $query is:
array (
1 => 50,
2 => 0,
3 => 0,
4 => 50,
5 => 50,
)
The second query is returning only refno and amount column. I need all the columns from $query2 grouped by Refno with sum of Amount in a key/value pair form. Please, can someone guide me to correct syntax.
回答1:
You shouldn't use map()
if you want to keep the values. Instead, use each()
to iterate and put()
to add a given key-value pair.
https://laravel.com/docs/5.8/collections#available-methods
$query = $query2->groupBy('refno')->each(function ($row) {
$row->put('sum', $row->sum('amount'));
});
The resulting object should look like this (I tested it in the console with your $query2
values)
>>> $query = $query2->groupBy('refno')->each(function ($row) { $row->put('sum', $row->sum('amount')); })
=> Illuminate\Support\Collection {#3163
all: [
1 => Illuminate\Support\Collection {#3171
all: [
0 => {#3149
+"date": "2019-08-08 14:11:14",
+"cdate": "2019-08-08",
+"refno": 1,
+"intime": "2019-08-08 14:11:14",
+"outtime": null,
+"amount": 0,
},
1 => {#3156
+"date": "2019-08-08 14:16:23",
+"cdate": "2019-08-08",
+"refno": 1,
+"intime": null,
+"outtime": "2019-08-08 14:16:23",
+"amount": 50,
},
"sum" => 50,
],
},
2 => Illuminate\Support\Collection {#3168
all: [
0 => {#3146
+"date": "2019-08-08 14:11:22",
+"cdate": "2019-08-08",
+"refno": 2,
+"intime": "2019-08-08 14:11:22",
+"outtime": null,
+"amount": 0,
},
"sum" => 0,
],
},
3 => Illuminate\Support\Collection {#3167
all: [
0 => {#3158
+"date": "2019-08-08 14:11:28",
+"cdate": "2019-08-08",
+"refno": 3,
+"intime": "2019-08-08 14:11:28",
+"outtime": null,
+"amount": 0,
},
1 => {#3155
+"date": "2019-08-08 14:16:27",
+"cdate": "2019-08-08",
+"refno": 3,
+"intime": null,
+"outtime": "2019-08-08 14:16:27",
+"amount": 0,
},
"sum" => 0,
],
},
4 => Illuminate\Support\Collection {#3144
all: [
0 => {#3157
+"date": "2019-08-08 14:12:03",
+"cdate": "2019-08-08",
+"refno": 4,
+"intime": "2019-08-08 14:12:03",
+"outtime": null,
+"amount": 0,
},
1 => {#3154
+"date": "2019-08-08 14:16:31",
+"cdate": "2019-08-08",
+"refno": 4,
+"intime": null,
+"outtime": "2019-08-08 14:16:31",
+"amount": 50,
},
"sum" => 50,
],
},
5 => Illuminate\Support\Collection {#3164
all: [
0 => {#3153
+"date": "2019-08-08 14:16:33",
+"cdate": "2019-08-08",
+"refno": 5,
+"intime": null,
+"outtime": "2019-08-08 14:16:33",
+"amount": 50,
},
"sum" => 50,
],
},
],
}
If you want the sum somewhere else just edit the code to suit your needs.
来源:https://stackoverflow.com/questions/57411024/getting-result-from-a-sum-on-laravel-collection