【问题标题】:Laravel 5: Set or get date format in DBLaravel 5:在数据库中设置或获取日期格式
【发布时间】:2017-09-21 03:44:07
【问题描述】:

我很难理解 Laravel 如何处理日期和 Carbon。我有一个模型,它有一个名为 published_at 的特殊字段(它是 DATE 字段)。当我将实例保存为对象时,我希望 laravel 使用碳转换该字段。

这是我的模型:

<?php

namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;


class Addon extends Model
{

// ...

protected $dates = [

    'published_at'
];

// ....

/**
 * Set the published_at date format
 *
 * @param $date
 * @return string
 */
public function setPublishedAtAttribute($date)
{
    $this->attributes['published_at'] = Carbon::createFromFormat('d/m/Y', $date);
}

// ....
}

因此,据我了解,published_at 字段现在应该使用 d/m/Y 格式保存为碳的实例。但是它在数据库中保存为 mm-dd-yyyy。

最后,我不在乎它是如何保存到数据库中的,所以这就是为什么我想创建一个getPublishedAtAttribute 并以我想要的格式检索它。那也没用。

我想要的只是 Laravel 将其格式化为 d/m/Y。无需我在每次展示时都执行{{ $addon-&gt;published_at-&gt;format('d/m/Y') }} 之类的操作。

顺便说一句:我希望 created_atupdated_at 也一样。任何想法我做错了什么?

Laravel 版本:5.3.31

【问题讨论】:

  • MySQL 以 'YYYY-MM-DD' 格式检索和显示 DATE 值。您可以在模型中创建一个 getter,以返回您希望它在视图中显示的格式。

标签: php laravel date laravel-5 php-carbon


【解决方案1】:

我建议你不要乱用这样的日期格式,而是创建一个这样的访问器..

public function getFormattedPublishedAtAttribute() {
    return $this->published_at->format('d/m/Y');
}

这样,您可以使用默认日期,也可以使用单独获取格式化日期..

$model->formattedPublishedAt;

【讨论】:

  • 应该这样工作吗?公共函数 getPublishedAtAttribute($date) { return $date->format('d/m/Y');因为对我来说,我得到Call to a member function format() on string
  • 当你做 $model-&gt;published_at 时,Laravel 会检查是否有 getPublishedAtAttribute() 方法,如果有,将值传递给它。但是由于我们使用了不同的名称,Laravel 将不知道我们想要哪个属性,这就是为什么我们必须使用 return $this-&gt;published_at-&gt;format() 来指定它
【解决方案2】:

您必须在 Carbon 指令中设置格式日期:

$this->attributes['published_at'] = Carbon::createFromFormat('d/m/Y', $date)->format('Y-m-d');

【讨论】:

    【解决方案3】:

    好吧,经过进一步挖掘,我做到了:

    public function getPublishedAtAttribute($date)
    {
        $date = new Carbon($date);
        return $date->format('d/m/Y');
    }
    

    这是有效的。但是我不明白为什么我必须做$date = new Carbon($date); 才能让它发挥作用。如果我忽略它,我会得到Call to a member function format() on string。 (尝试使用published_atcreated_atupdated_at,都一样)。

    但是由于published_at 在我的$dates = []; 数组中,不应该自动将其视为碳实例吗? created_atupdated_at 更是如此?

    但据我所知,事实并非如此。如果我dd($addon-&gt;created_at); 它只是一个字符串,而不是碳实例(如果我省略了$date = new Carbon($date);)。

    【讨论】:

    • 对不起,我错了。这是一个碳实例。对我来说为什么我必须在访问器中新建一个碳实例仍然没有意义。
    • 您不需要创建 Carbon 实例。 Laravel 中 created_atupdated_at 的日期默认是 Carbon 实例。如果您使用软删除,您意识到您需要创建一个protected $dates = ['deleted_at']; 这是为deleted_at 创建一个 Carbon 实例。
    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多