【发布时间】:2021-04-07 11:34:15
【问题描述】:
我正在与 Laravel 8 中的模型转换日期(可选日期时间)字段的一个经常提到的问题作斗争。但是,由于我使用许多基于时间的操作和函数,我需要在我的代码中使用 DateTime 或 Carbon 的功能,通过 MySQL Y-m-d 格式实例化它们是不切实际的。
Laravel 文档建议使用强制转换作为最优雅的解决方案,不幸的是我无法以任何方式使其工作,无论我做什么,日期都保留为字符串。许多 SO 答案建议使用protected $dates,这似乎只在 Laravel 5.3 文档中提到并且似乎已被弃用,Laravel 8 提到了protected $casts,但这些属性都不适合我。一些答案还提到,这些解决方案都不适用于他们,而使用 mutators 和 accessors 是唯一有效的解决方案,但对我来说,这对于一个简单的问题来说似乎是一个不必要的困难解决方案。更糟糕的是,Laravel 提到 created_at 和 updated_at 字段默认转换为 Carbon,但它们也以字符串的形式出现。
什么才是真正适合 Laravel 8 的最佳方法? protected $dates 是否已弃用?为什么有这么多protected $casts 不起作用的情况?是否有任何隐藏的配置需要编辑以使其工作,我错过了?如果有任何意见或经验,我将不胜感激。
【问题讨论】:
-
让我们备份。当您说“它们也出现并充当字符串”时,您如何确定这一点?如果您输出它们,它们将通过 PHP 的
__toString自动进行字符串化。尝试dd()@created_at日期,它应该以 Carbon 对象的形式出现。 -
我试过
dd()、var_dump()和php artisan tinker直接输出,总是一个字符串。出于好奇,我尝试将 tinyints 转换为布尔值,也没有变化,也许演员本身通常无法正常工作?还是没有线索…… -
我非常广泛地使用演员表,包括 Laravel 8。(是的,
$dates被更全面的$casts功能取代。)你能用$casts定义向我们展示你的模型吗?
标签: php laravel eloquent laravel-8