如何在 Laravel 中清洗数据库查询返回的时间数组

11次阅读

如何在 Laravel 中清洗数据库查询返回的时间数组

本文介绍如何将 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)或用于时间序列分析。

text=ZqhQzanResources