
本文介绍如何将 laravel 查询结果中包含完整时间戳(如 `2022-02-21 07:40:16`)的键或字段,提取并格式化为仅保留时分秒(如 `07:40:16`)的干净数组,适用于图表渲染、前端展示等场景。
在 Laravel 中处理数据库时间字段时,常需对原始 created_at 等 Carbon 实例进行格式化清洗,而非依赖字符串截取。原代码使用 pluck('RSSI', 'created_at') 将时间作为数组键,虽简洁但不利于后续时间格式化(因键无法直接调用 ->format() 方法)。更推荐的方式是显式获取模型实例,再逐项调用 Carbon 的 format() 方法。
以下是优化后的完整实现:
public function singleDev(Device $deviceID)
{
// 使用 select 明确字段,避免冗余数据;get() 返回 Collection
$data = DataFromRasp::select('RSSI', 'created_at')
->where('MAC', 'C4:A5:DF:24:05:7E')
->get();
$time_array = [];
$rssi_array = [];
$cnt = 0;
foreach ($data as $item) {
// ✅ 安全提取并格式化时间:Carbon 实例支持 format()
$time_array[] = $item->created_at->format('H:i:s');
$rssi_array[] = $item->RSSI;
// ⚠️ 注意:原代码中 if($value < -60) 的 $value 未定义,应改为 $item->RSSI
if ($item->RSSI < -60) {
$cnt++;
if ($cnt >= 2) {
// 可在此添加触发逻辑,如告警、记录等
}
}
}
// 调试输出清洗后的时间数组(如 ['07:40:16', '07:41:22', ...])
dd($time_array);
return view('backend.auth.user.singleDevice', compact('time_array', 'rssi_array'));
}关键改进说明:
- 避免 pluck() 作键值映射:pluck('RSSI', 'created_at') 会将 created_at 的原始字符串(如 "2022-02-21 07:40:16")直接用作数组键,而该键无法链式调用 Carbon 方法;改用 get() 获取模型集合,确保 created_at 是可操作的 Carbon 实例。
- 正确使用 Carbon 格式化:$item->created_at->format('H:i:s') 输出 24 小时制时分秒(如 07:40:16);若需 12 小时制加 AM/PM,可用 'g:i:s A'。
- 修复变量引用错误:原循环中 if ($value RSSI。
-
性能提示:若数据量较大,可考虑使用 map() 链式处理替代 foreach,提升可读性:
$time_array = $data->map(fn($item) => $item->created_at->format('H:i:s'))->values()->toArray(); $rssi_array = $data->pluck('RSSI')->toArray();
最终,$time_array 将是一个纯字符串数组,每个元素均为标准化的 HH:ii:ss 格式,可直接传递给前端图表库(如 Chart.js)或用于时间序列分析。










