0

我有一个名为的字段activated_at,我想像对待 Laravel 中的其他日期一样对待它。在数据库中,它是一个时间戳,我将它$dates与常见日期(如updated_at,created_atdeleted_at.

小旁注,这是 API 系统的一部分,它根本不依赖表单和 Web,所以我不能直接从视图转换数据

问题是,为了正确设置和获取它,我设置了两个突变器(AKA Getter 和 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 中是否有更好的方法来处理 DateTime ?我不介意处理所有的约会时间created_atupdated_at并且deleted_at已经在幕后处理了

TL;博士

有没有更好的方法来使用 Laravel 5.1.x 中的 mutators 处理 DateTime?我不介意处理所有的约会时间created_atupdated_at并且deleted_at已经在幕后处理了

4

2 回答 2

0

使用 laravel 5.2 就不需要这个了

于 2016-03-01T09:01:52.647 回答
0

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

protected $dates=['activated_at'];

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

User::findOrFail(1)->activated_at->diffForHumans();
于 2016-11-27T08:21:15.313 回答