CakePHP使用patchEntities保存日期时被存为纪元时间问题求助
问题根因排查&解决步骤
- 第一步:校验数据库字段类型
先直接检查数据库lease_submissions表的reporting_period字段配置,如果字段类型设置为INT/BIGINT而非DATE,CakePHP ORM会自动将日期对象转换为Unix时间戳存储,直接触发你遇到的问题,修改字段类型为DATE即可。 - 第二步:校验Table类字段类型映射
打开src/Model/Table/LeaseSubmissionsTable.php,检查initialize方法中的字段类型配置,确认reporting_period的类型设置为date,错误的配置示例(会导致转时间戳)和正确配置如下:// 错误配置(如果写了这个删掉) $this->getSchema()->setColumnType('reporting_period', 'timestamp'); $this->getSchema()->setColumnType('reporting_period', 'integer'); // 正确配置 $this->getSchema()->setColumnType('reporting_period', 'date'); - 第三步:检查实体修改器逻辑
打开src/Model/Entity/LeaseSubmission.php,查找是否存在_setReportingPeriod自定义赋值方法,该方法会在字段赋值时自动触发,如果内部日期转换逻辑错误(比如格式匹配规则写错、时间戳/日期转换逻辑写反),会导致日期解析异常出现0169年这种错误值,可先注释该方法测试是否恢复正常。 - 第四步:检查全局日期解析规则
打开config/app.php,检查全局日期相关配置,确认默认日期解析格式为Y-m-d,如果全局配置为d/m/Y/m/d/Y等其他格式,会导致传入的2021-09-01格式不匹配,解析出错误的日期值。 - 第五步:删除手动日期转换代码
CakePHP ORM本身支持自动将符合格式的日期字符串转换为对应的FrozenDate对象,你当前代码中手动循环修改reporting_period为Y-m-d字符串的逻辑完全多余,删除后反而可以避免手动转换带来的格式冲突问题。
内容的提问来源于stack exchange,提问作者Aaron Blakeley
相关产品推荐
相关产品推荐

