【问题标题】:What's the deal with Laravels date casting?Laravel 日期转换有什么问题?
【发布时间】: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_atupdated_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


【解决方案1】:

想通了,虽然dd()var_dump()等检查方法在检查整个模型实例时,专门将属性描述为字符串,但我犯了一个错误,没有单独检查每个属性。

只有在直接调用属性之后,它才会“变异”为所需的类型(无论是 Carbon 还是 boolean 或其他类型)。这对所有$casts 元素都有效,不仅是日期和日期时间。

需要指出的是,在将模型实例传递给刀片模板时,必须将它们嵌套在数组中,否则它们会变成数组并失去包括演员表在内的模型能力。

还需要注意的是,$dates 没有被使用(虽然没有被弃用,但它们仍然有效)并且不再记录,@ceejayoz 指出,$casts 是更通用和首选的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多