Getting result from a sum on laravel collection

一曲冷凌霜 提交于 2019-12-13 00:44:56

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!