Laravel未检索DateTime列中的毫秒

Laravel未检索DateTime列中的毫秒,laravel,laravel-5,laravel-5.6,Laravel,Laravel 5,Laravel 5.6,在Laravel中,我有一些带有毫秒的列。请注意,其他一些列没有毫秒(例如,在处创建,在处更新) 以下是我的迁移: Schema::create('brands', function (Blueprint $table) { $table->increments('id'); $table->dateTime('sync_date_time', 3); $table->timestamps(); }); 我的模型很简单: class Brand ext

在Laravel中,我有一些带有毫秒的列。请注意,其他一些列没有毫秒(例如,
处创建,
处更新)

以下是我的迁移:

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

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

请注意,这不是一个碳问题,因为我根本没有在这个领域使用碳

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


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

将此置于模型的顶部:

protected$dates=['sync_date_time']

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

$brand->sync\u date\u time->格式('Y-m-d H:i:s.u')


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

此问题与Laravel无关,但是由于较新版本的MySQL的PDO中存在已知错误

PHP7.2中存在此问题,PHP7.3中已修复此问题

所以要解决这个问题,只需升级到PHP7.3

如果您想自动转换到碳日期,我发现在
设置
保存
到阵列
时,以下操作不起作用:

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');
}

但是请记住,您仍然需要升级到PHP7.3

可能是重复写@cfnerd的答案。格式(“m-d-Y H:i:s.u”)必须有效。@cfnerd首先,我甚至还没有将碳引入其中。因此,
格式
方法不可用。但是,即使我在
casts
属性中添加dateTime,也只会将毫秒返回为0。这并不是说我不能使用碳。返回的属性是一个字符串。我甚至没有把它铸造成任何其他类型。因此,将字符串
2018-12-19 01:40:46
强制转换为DateTime,然后对其进行格式化将不起作用。尝试过这种方法,但毫秒仅显示为零,并且它们在数据库中肯定100%不是零,对吗?因为如果保存时不提供,它们将被默认。100%不是零,以DB表示。使用MySQL的任何新版本,您都可以自己尝试。这看起来像是一个已知的问题。您能进入mysql并运行一个查询来选择带有datetime的记录吗?类似于
从x=y的表中选择sync\u date\u time,它是否显示微秒?是。这个问题可以通过升级到PHP7.3来解决。这是PDO中的一个bug。