Laravel 5.1.x如何正确操作日期?

时间:2015-10-27 09:24:41

标签: php datetime laravel-5.1 mariadb php-carbon

我有一个名为activated_at的字段,我希望像Laravel中的其他日期一样对待它。在数据库中,它是一个时间戳,我将其插入$dates数组并与updated_atcreated_atdeleted_at等常见日期一起插入。

小方注释这是API系统的一部分,它完全不依赖于表单和Web,因此我无法直接从视图转换数据

问题在于,为了设置和正确设置,我设置了两个mutator(AKA Getter和Setter)。

当前的setter,它不是那里最好的解决方案,但老实说我不知道​​如何创建一个setter,将所有数据转换为适合数据库的数据。我正在使用MariaDB

* Automatically parse the date from metric system to
 * Imperial system because American DATABASES
 *
 * @param string $value
 */
public function setActivatedAtAttribute($value)
{
    if(!$value instanceof \DateTime)
    {
        $value = Carbon::createFromFormat('d/m/Y H:i:s', $value)->toDateTimeString();
    }
    $this->attributes['activated_at'] = $value;
}

无论如何,这个安装人员工作得很好,我已经写了一堆单元测试,然后我就会看到它们。

真正的问题是getter,我虽然它返回了日期的Carbon实例,但它只是返回一个字符串

/**
 * Return the correct metric format of the date
 *
 * @param string $value
 * @return string
 */
public function getActivatedAtAttribute($value)
{
    // Because it's a string we cannot use Carbon methods
    // Unless we instantiate a new Carbon object which it stupid
    // Since the activated_at field is inside the $dates array
    // Shouldn't we get the carbon object automatically?
    return $value;
}

我关注的是getter方法中的注释块。

话虽如此,是否有更好的方法在Laravel 5.1.x中使用mutator处理DateTime?我不介意处理所有日期时间,因为created_atupdated_atdeleted_at已经在幕后处理

TL; DR

  

有没有更好的方法来使用Laravel 5.1.x中的mutators处理DateTime?我不介意处理所有日期时间,因为created_atupdated_atdeleted_at已经在幕后处理

2 个答案:

答案 0 :(得分:0)

使用laravel 5.2时,不需要这个

答案 1 :(得分:0)

据我所知,在Laravel 5.1中,您应该将以下代码添加到您的模型中,其中包含字段' activated_at'。

protected $dates=['activated_at'];

并且您不需要任何getter方法来获取碳对象,您可以直接在控制器中调用它的功能。例如,以用户模型为例:

User::findOrFail(1)->activated_at->diffForHumans();