Друг, если вы хотите использовать коллекцию для группировки, а также суммировать значения в группе, я считаю, что еще не слишком поздно.
Давайте воспользуемся примером ниже:
Я будусделайте пример результата вашего красноречивого запроса следующим образом: скажем, у нас есть пользователи
$users = collect();
foreach (range(1, 9) as $item) {
foreach (range(1, 9) as $ninja) {
$users->push([
'created_at' => \carbon('2018-0' . $item),
'preco' => (string)'160.00' . $item
]);
}
}
Выше должно быть что-то вроде этого ...
[
{
"created_at": "2018-01-01 00:00:00",
"preco": "160.001"
},
{
"created_at": "2018-01-01 00:00:00",
"preco": "160.001"
},
{
"created_at": "2018-01-01 00:00:00",
"preco": "160.001"
},
...
]
Затем мы группируем пои преобразовать (или отобразить) результат, используя ...
$users->map(function ($user) {
$user['preco'] = str_replace('.', '', $user['preco']);
return $user;
})->groupBy(function ($user) {
return Carbon::parse($user['created_at'])->format('m');
})->transform(function ($value, $key) { //it can also be map()
return [
'preco_sum' => $value->pluck('preco')->sum()
];
});
Здесь мы имеем сумму каждой группы месяцев ...
ОБНОВЛЕНИЕ
Если запись большая, то вы можете сократить пинг map
, используя Accessor
У вас может быть что-то, что форматирует ваше поле preco следующим образомв вашей модели, например, так:
/**
* Get the user's first name.
*
* @param string $value
* @return string
*/
public function getPrecoAttribute($value)
{
return str_replace('.', '', $value);
}
Это означает, что когда Laravel строит объекты Eloquent, это значение будет отформатировано, как указано, что означает, что вы можете удалить первый map()
из результата.
PS: вам может понадобиться мутатор, чтобы изменить его на формат, который вы хотите в базе данныхпри сохранении.
Ура!