我见过类似的问题,但老实说,我没有看到任何可以带我走上正确道路的东西,那是因为我也在寻找更好的方法来做到这一点。
在我的应用程序中的某个时刻,我使用图表js,我需要显示月份,然后显示值(销售额)。为此,我知道(或者我认为)我必须检索数据按月分组,到目前为止我已经到了这里:
$records = TabelaAngariacao::select('preco', 'created_at')
->where('estado', '=', 'Vendido')
->get()
->groupBy(function($date) {
return Carbon::parse($date->created_at)->format('m');
});
嗯...正如你所看到的,我不是 SUMING 任何东西,那是因为在我的数据库中,我的值存储在 varchar(带点!)中,我知道这不是正确的做事的方式,但在这一点上改变一切,它现在对我来说不是一个解决方案,那么我怎样才能改变这个函数以删除点并做一个适当的总和?我尝试过使用 CAST,但它给了我未定义的函数。
有什么建议吗?感谢您抽出时间,问候。
--编辑--
大家好,我想我已经快到了,我不知道 transform 函数,在那里我可以对 preco(price) 字段进行一些修改,该字段仍然存在 varchar 的问题,所以我需要删除点才能使总和起作用,我所拥有的是:
$records = TabelaAngariacao::select('preco', 'created_at')
->where('estado', '=', 'Vendido')
->get()
->groupBy(function($date) {
return Carbon::parse($date->created_at)->format('m');
})->transform(function ($value) { //it can also be map()
$nStr = str_replace(".", "", $value->pluck('preco'));
return [
'preco_sum' => $nStr->sum()
];
});
但这不起作用,因为 $nStr 是字符串......我需要做什么?如果我转换为浮点数,那么总和将不起作用...如果我这样离开,175.000 和 1.000.000 之间的总和将是 176.000,这是错误的...有什么想法吗?
我这样做是为了按月进行汇总和分组
$ventas = Operacion::select([
DB::raw("DATE_FORMAT(created_at, '%Y') year"),
DB::raw("DATE_FORMAT(created_at, '%m') month"),
DB::raw("SUM(1) cantidad"),
DB::raw("SUM(operacion_total) total"),
DB::raw("SUM(CASE WHEN estado = 'OPEFIN' THEN operacion_total ELSE 0 END) total_finalizado")
])->groupBy('year')->groupBy('month')->get();
如果你需要转换一些 varchar 你可以这样做
CAST(operacion_total as DECIMAL(9,2))
所以 select 中的一列可以是
DB::raw("SUM(CAST(operacion_total as DECIMAL(9,2))) total"),
请尝试一下并让我知道它是如何工作的:)
尝试这个查询。
$records = TabelaAngariacao::select(
\DB::raw('sum(cast(preco as double precision)) as sums'),
\DB::raw("DATE_FORMAT(created_at,'%M %Y') as months"))
->where('estado', '=', 'Vendido')
->groupby('months')->get();
朋友,如果你想利用集合进行分组并对组中的值求和我相信还不算太晚。
让我们使用下面的例子:
我将使用以下内容制作您雄辩查询的示例结果......假设我们有用户
$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()
];
});
这里我们有每个月份组的总和...
更新
如果记录很大,可以使用
Accessor减少
map
ping
您可以使用如下内容来格式化模型中的“preco”字段,如下所示:
/**
* Get the user's first name.
*
* @param string $value
* @return string
*/
public function getPrecoAttribute($value)
{
return str_replace('.', '', $value);
}
这意味着当 Laravel 构建 Eloquent 对象时,该值将按照指定的格式进行格式化,这意味着您可以从结果中删除第一个
map()
。
PS:保存时,您可能需要一个变元将其更改为数据库中所需的格式。
干杯!