laravel - Laravel 没有在 DateTime 列中检索毫秒
问题描述
在 Laravel 中,我有一些以毫秒为单位的列。请注意,其他一些列没有毫秒数(例如created_at
, updated_at
)。
这是我的迁移:
Schema::create('brands', function (Blueprint $table) {
$table->increments('id');
$table->dateTime('sync_date_time', 3);
$table->timestamps();
});
我的模型很简单:
class Brand extends Model {}
然而,当我有一个毫秒(例如2018-12-19 01:40:46.512
)的记录,并执行:
$brand->sync_date_time;
它总是返回一个没有毫秒部分的字符串(例如2018-12-19 01:40:46
)。
为什么会发生这种情况,我该如何解决这个问题?
请注意,这不是 Carbon 问题,因为我根本没有在该字段中使用 Carbon。
我在这里看到了一个类似的问题:
声称这实际上是一个 PDO 问题,并建议使用字符串或时间戳。但这是一个相当古老的答案,所以我希望有一个更好的答案。
解决方案
这个问题与 Laravel 无关,但由于 PDO 中的一个已知错误与较新版本的 MySQL。
此问题存在于 PHP 7.2 中,并已在 PHP 7.3 中修复。
所以要解决这个问题,只需升级到PHP 7.3。
setting
如果您想自动转换为碳日期,我发现以下内容在,saving
和方面不起作用toArray
:
protected $casts = [
'sync_date_time' => 'datetime:Y-m-d H:i:s.v',
];
相反,我发现您必须在该列的强制转换中没有任何内容,并将以下方法添加到模型中:
public function getSyncDateTimeAttribute(string $value): Carbon
{
return Carbon::createFromFormat('Y-m-d H:i:s.v', $value);
}
public function setSyncDateTimeAttribute(Carbon $value): void
{
$this->attributes['fidel_created'] = $value->format('Y-m-d H:i:s.v');
}
但请记住,您仍然需要升级到 PHP 7.3!
推荐阅读
- excel - 在 Excel VBA 中指示一组函数调用已完成
- javascript - 让 React 组件知道它们是从哪里导入的
- c# - 如果使用从方法返回的 lambda,为什么事件取消订阅会起作用(“不泄漏”)?
- xml - 为 XML 片段设置 BindingContext
- windows - 在内核驱动程序中接收鼠标输入后将其发送到操作系统
- javascript - Webpack 代码拆分 - 通过请求单个块自动加载所有块?
- java - IBM MQ 使用 Java 获取 LGETTIME
- python - 无法在子进程中获取二进制标准输入/标准输出
- kubernetes - 使用 kubeadm 时如何在 kubeapi-server 上设置与审计相关的标志?
- android - 如何使用 BigNerdRanch 折叠父级展开 Recyclerview 库