Laravel - 按月获取数据并求和(varchar)

问题描述 投票:0回答:3

我见过类似的问题,但老实说,我没有看到任何可以带我走上正确道路的东西,那是因为我也在寻找更好的方法来做到这一点。

在我的应用程序中的某个时刻,我使用图表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,这是错误的...有什么想法吗?

php laravel laravel-5
3个回答
0
投票

我这样做是为了按月进行汇总和分组

$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"),

请尝试一下并让我知道它是如何工作的:)


0
投票

尝试这个查询。

$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();

0
投票

朋友,如果你想利用集合进行分组并对组中的值求和我相信还不算太晚。

让我们使用下面的例子:

我将使用以下内容制作您雄辩查询的示例结果......假设我们有用户

    $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:保存时,您可能需要一个变元将其更改为数据库中所需的格式。

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.