Laravel不会在DateTime列中检索毫秒数

问题描述 投票:0回答:2

在Laravel中,我有一些毫秒的列。请注意,其他一些列没有毫秒(例如created_atupdated_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)。

为什么会发生这种情况,我该如何解决这个问题呢?

请注意,这不是碳问题,因为我根本没有使用碳。

我在这里看到了类似的问题:

Laravel timestamps to show milliseconds

声称这实际上是一个PDO问题并建议使用字符串或时间戳。但这是一个很老的答案,所以我希望有更好的答案。

laravel laravel-5 laravel-5.6
2个回答
1
投票

这个问题与Laravel没有任何关系,但是由于PDO中存在已知错误的MySQL版本。

此问题存在于PHP 7.2中,并已在PHP 7.3中修复。

所以要解决这个问题,只需升级到PHP 7.3即可。

如果你想自动转换为碳日期,我发现以下内容对settingsavingtoArray不起作用:

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 getSyncDateTimeAttribute(Carbon $value): void
{
    $this->attributes['fidel_created'] = $value->format('Y-m-d H:i:s.v');
}

但请记住,您仍然需要升级到PHP 7.3!


0
投票

把它放在模型的顶部:

protected $dates = ['sync_date_time'];

Laravel会自动将其转换为Carbon实例,然后您可以使用以下内容进行格式化:

$brand->sync_date_time->format('Y-m-d H:i:s.u')

您也可以尝试在模型顶部设置受保护的$dateFormat变量。

© www.soinside.com 2019 - 2024. All rights reserved.