Laravel未在DateTime列中检索毫秒

时间:2019-01-29 15:00:41

标签: laravel laravel-5 laravel-5.6

在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)。

为什么会这样,怎么解决这个问题?

请注意,这不是Carbon问题,因为我根本没有在此字段中使用Carbon。

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

Laravel timestamps to show milliseconds

声称这实际上是PDO问题的

,建议使用字符串或时间戳。但这是一个很旧的答案,所以我希望有一个更好的答案。

2 个答案:

答案 0 :(得分:1)

此问题与Laravel无关,而是由于PDO中使用较新版本的MySQL的已知错误。

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

因此,要解决此问题,只需升级到 PHP 7.3

如果您要自动广播到Carbon日历,则在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!

答案 1 :(得分:0)

将其放在模型顶部:

lessThenEqual

Laravel将自动将其强制转换为Carbon实例,然后您可以使用以下实例简单地对其进行格式化:

protected $dates = ['sync_date_time'];

您也可以尝试在模型顶部设置受保护的$brand->sync_date_time->format('Y-m-d H:i:s.u')变量。