You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Laravel将集合格式化为含数组的指定结构对象

Laravel转换时间格式适配前端DateTimePicker禁用时间区间需求

我有一张schedules表,每行都包含start_time和end_time字段。目前通过Laravel代码能获取并映射成字符串格式的时间数组,但需要转换成特定结构的对象——外层是带moments属性的对象,moments是二维数组,每个子数组包含两个带hour和minute属性的对象,分别对应每行的start_time和end_time。这个格式要用来配置前端DateTimePicker组件的disabledTimeIntervals,实现指定时间区间禁用。

表结构及示例数据

+----------+------------------+----------------+-------------+
|    id    |    start_time    |    end_time    |   user_id   |
+----------+------------------+----------------+-------------+
|    1     |       6:45       |      7:45      |      1      |
|    2     |       10:30      |      11:30     |      1      |
+----------+------------------+----------------+-------------+

当前Laravel代码及输出结果

$user = User::find(1);

$schedules = Schedule::select('start_time', 'end_time')
  ->whereBelongsTo($user)
  ->get();

$collection = $schedules->map(function ($time) {
  return [date("g:i", strtotime($time['start_time'])), date("g:i", strtotime($time['end_time']))];
});

$data = $collection->values()->all();

// 输出结果
[
  [
    "6:45",
    "7:45",
  ],
  [
    "10:30",
    "11:30",
  ],
]

期望得到的格式

{
    "moments": [ 
        [ { "hour": 6, "minute": 45 }, { "hour": 7, "minute": 45 } ],
        [ { "hour": 10, "minute": 30 }, { "hour": 11, "minute": 30 } ]  
    ]
}

前端使用该数据的代码

const timeIntervalsData = JSON.stringify( { moments: [ 
    [ { hour: 6, minute: 45 }, { hour: 7, minute: 45 } ],
    [ { hour: 10, minute: 30 }, { hour: 11, minute: 30 } ]  
  ]
});

let options = {
    format: 'hh:mm A',
    disabledTimeIntervals: JSON.parse(timeIntervalsData)
      .moments
      .map( ([start, end]) => [ moment(start), moment(end) ] )
}

$('.datetimepicker').datetimepicker(options)

内容的提问来源于stack exchange,提问作者Lucky Person

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:10:40