PHP Laravel中如何计算每行element_degree字段JSON值的度数总和
解决方案
方案1:模型层处理(最常用,推荐)
首先在你的Empdata模型中做以下配置:
- 配置JSON字段自动类型转换,避免手动处理JSON解码
// app/Models/Empdata.php protected $casts = [ 'element_degree' => 'array', // 自动将数据库存储的JSON字符串转为数组 ];
- 新增访问器自动计算度数总和
// 追加到模型返回结果的字段 protected $appends = ['degree_total']; // 度数总和计算逻辑 public function getDegreeTotalAttribute() { // 兼容JSON字段为空的场景,避免报错 return empty($this->element_degree) ? 0 : array_sum($this->element_degree); }
配置完成后,你原有代码$data = empdata::all();获取到的每一条数据,都会自动携带degree_total字段,即为该条记录所有度数的总和。
使用示例:
// 遍历获取每个用户的总度数 foreach ($data as $item) { echo "用户ID: {$item->用户ID}, 总度数: {$item->degree_total} <br>"; }
按你给出的示例数据,用户ID2的总度数为252,用户ID3为220,用户ID4为240,计算结果完全匹配。
方案2:查询层SQL计算(适合需要在数据库层面完成统计的场景)
如果你使用的是MySQL 8.0及以上版本,可以直接在查询时通过JSON函数计算总和,无需修改模型:
$data = empdata::selectRaw('*, ( SELECT SUM(CAST(JSON_UNQUOTE(JSON_EXTRACT(element_degree, CONCAT("$.", `key`)) AS UNSIGNED)) FROM JSON_TABLE(JSON_KEYS(element_degree), "$[*]" COLUMNS(`key` VARCHAR(255) PATH "$")) AS jk ) as degree_total')->get();
查询得到的结果同样会携带degree_total总度数字段。
内容的提问来源于stack exchange,提问作者Abdelkawy Salah
相关产品推荐
相关产品推荐

