fastadmin自动写入时间戳坑点 | 我的日常分享

fastadmin自动写入时间戳坑点

fastadmin自动写入时间戳坑点

数据库中时间使用的是datetime类型,在fastadmin使用thinkPHP5自动写入时间字段值报错,SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '1649901669' for column 'createtime' at row 1

image-20220414100044176

1、坑点1

通过将database.php配置为datetime仍然不行。

1
2
// 自动写入时间戳字段
'auto_timestamp' => 'datetime',

这里避坑,通过将auto_timestamp设置为datetime后,注释说时间字段取出后的默认时间格式,默认为Y-m-d H:i:s,但是仍然需要指定为'datetime_format' => Y-m-d H:i:s,否则将无法正确写入。

1
2
// 时间字段取出后的默认时间格式,默认为Y-m-d H:i:s
'datetime_format' => false,

2、坑点2

fastadmin中一键生成CRUD,自动在模型前面加了一段代码。将时间戳类型设置为了int,这里的优先级高于database.php中配置的自动写入时间戳,所以实际配置还是int,这样就导致了无法插入了。我们可以把$autoWriteTimestamp='int'删掉。让database.php中的配置生效。

1
2
3
4
5
6
7
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'int';

// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
protected $deleteTime = 'deletetime';

3、坑点3

如果在坑点2中没有删掉,而是把protected $autoWriteTimestamp = 'int';改为了protected $autoWriteTimestamp = 'datatime';,会发现仍然不行,最后发现还是需要设置$dateFormat才能正常,如下:

1
2
3
4
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 时间字段取出后的默认时间格式
protected $dateFormat = 'Y-m-d H:i:s';

上面代码等效,且$type优先级高于上面两行代码,即如果配置了$type,则上面两行配置不会生效。

1
2
3
4
5
6
// 字段类型或者格式转换
protected $type = [
'createtime'=>'datetime:Y-m-d H:i:s',
'updatetime'=>'datetime:Y-m-d H:i:s',
'deletetime'=>'datetime:Y-m-d H:i:s'
];