Laravel:如何在模型属性转换上设置日期格式?

fic*_*489 13 casting date laravel laravel-5

我有模特:

protected $casts = [
    'date' => 'date',
];
Run Code Online (Sandbox Code Playgroud)

laravel是否具有设置强制转换格式的能力,例如:

protected $casts = [
    'date' => 'date_format:d/m/yyyy',
];
Run Code Online (Sandbox Code Playgroud)

EDITED

我试过这个:

在模型中:

protected $dateFormat = 'm/d/Y';

protected $dates = ['driver_expiration', 'created_at', 'updated_at', 'deleted_at'];

protected $casts = [
    'driver_expiration'     => 'date',
];
Run Code Online (Sandbox Code Playgroud)

我将日期(driver_expiration)保存为'01/012016'但日期已保存.

laravel文档:https://laravel.com/docs/5.1/eloquent-mutators 告诉我们$ dateFormat仅适用于时间戳('created_at','updated_at','deleted_at')

Hem*_*ela 27

在laravel 5.6之后,

您可以单独自定义Eloquent日期和日期时间转换的格式:

protected $casts = [
    'birthday'  => 'date:Y-m-d',
    'joined_at' => 'datetime:Y-m-d H:00',
];
Run Code Online (Sandbox Code Playgroud)

将模型序列化为数组或JSON数据时使用此格式


Nir*_*hah 24

您可以使用mutators来设置您喜欢的格式,而不是转换日期格式:

例如,如果调用了列,则date可以将以下函数添加到模型中:

public function setDateAttribute( $value ) {
  $this->attributes['date'] = (new Carbon($value))->format('d/m/y');
}
Run Code Online (Sandbox Code Playgroud)

setDateAttribute总是在格式set[ColumnName]Attribute,使用驼峰.将date$this->attributes['date']部分也必须在该表符合您实际的列名.

当您createupdate数据库中的记录时,上述功能将自动更改格式.

注意:您可能需要将use Carbon\Carbon语句添加到模型的顶部以使用Carbon库.

看看这里的其他例子.


UPDATE

(可选)您可以date使用以下内容定义列的格式:

protected $dateFormat = 'Y-m-d';
Run Code Online (Sandbox Code Playgroud)

  • 我不想要1000个mutators,并重复代码....数组更优雅实用. (2认同)

小智 5

只需添加到模型中:

protected function asDateTime($value)
{
    return parent::asDateTime($value)->format('d/m/y');
}
Run Code Online (Sandbox Code Playgroud)

这个 Eloquent 的方法最初返回一个 Carbon 实例,因此您可以获取该实例并调用它的 format() 方法。如果您希望将此解决方案应用于所有模型,只需创建一个从 Eloquent 扩展的新类,并将此方法放在那里,这样您就可以从这个新类扩展模型。