Laravel未检索DateTime列中的毫秒
在Laravel中,我有一些带有毫秒的列。请注意,其他一些列没有毫秒(例如,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
在
处创建,在
处更新)
以下是我的迁移:
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。