碳日期在数据库中保存为字符串

Carbon Date Being Saved as String in Database

我正在尝试使用工厂来播种一些数据。我试图播种的字段之一是日期字段——我在我的工厂中使用以下代码这样做:

return [
    ...
    'date' => Carbon::now()->subDays(rand(1, 365))->startOfDay()
];

问题是,这是作为字符串保存在数据库中的 -- 这意味着我不能在我的 blade 模板中执行以下操作:{{ $transaction->date->format('M, d Y') }}

当我尝试这样做时,我收到以下错误消息:Call to a member function format() on string

作为测试,我在我的 blade 模板中尝试了完全相同的代码,只是将 created_at 切换为 date - 它按我想要的方式工作。即,这有效:{{ $transaction->created_at->format('M, d Y') }}.

万一重要,created_at 字段是在我的迁移文件中使用 $table->timestamps() 创建的,而 date 字段是按如下方式创建的:$table->date('date');.

知道我需要做什么才能让它工作吗?

谢谢。

Laravel 提供了一种将某些模型属性“转换”为特定数据类型的方法,包括字符串、整数、日期等。由于 Carbon 内置于 Laravel,指定 date type auto-converts Carbon 实例的模型属性。您需要做的就是为您的模型提供该逻辑:

class Transaction extends Model {
  protected $casts = [
    'date' => 'date'
  ];
  ...
}

现在,当您检索 Transaction 模型记录时,date 属性将自动成为 Carbon 实例:

$transaction = Transaction::first();
dd($transaction->date, get_class($transaction->date));
// ^ Carbon\Carbon @1646769789^ {#4514 ... }, `Carbon\Carbon`

现在,您可以简单地通过链接来执行 Carbon 逻辑:

{{ $transaction->date->format('Y-m-d') }}
// `2022-03-08`

有更多的转换类型可用,您只需将它们作为 key/value 对添加到 $casts 数组即可指定多个属性转换。完整文档在这里:

https://laravel.com/docs/9.x/eloquent-mutators#attribute-casting