Laravel 5.1.x, как правильно манипулировать датой?

У меня есть поле с именем activated_at, и я хочу рассматривать его как любую другую дату в Laravel. В базе данных это метка времени, и я вставил ее в массив $dates вместе с общими датами, такими как updated_at, created_at и deleted_at.

Небольшое примечание: это часть системы API, которая вообще не зависит от форм и сети, поэтому я не могу преобразовать данные непосредственно из представления.

Проблема в том, что для правильной установки и получения я установил два мутатора (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;
}

В любом случае, эти сеттеры работают вполне нормально, я написал кучу модульных тестов, и я получаю от них зеленый.

Настоящая проблема - это геттер, который, как мне кажется, возвращает экземпляр даты 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;
}

Мои опасения находятся в блоке комментариев внутри метода получения.

При этом есть ли лучший способ справиться с обработкой DateTime с помощью мутаторов в Laravel 5.1.x? Я не возражаю против обработки ВСЕХ даты и времени, поскольку created_at, updated_at и deleted_at уже обрабатываются за кулисами

TL;DR

есть ли лучший способ справиться с обработкой DateTime с помощью мутаторов в Laravel 5.1.x? Я не возражаю против обработки ВСЕХ даты и времени, поскольку created_at, updated_at и deleted_at уже обрабатываются за кулисами


person Claudio Ludovico Panetta    schedule 27.10.2015    source источник
comment
как правильно манипулировать dat [e]?   -  person Athi Krishnan    schedule 27.10.2015
comment
О да, я редактирую   -  person Claudio Ludovico Panetta    schedule 27.10.2015


Ответы (2)


С laravel 5.2 в этом нет необходимости

person Claudio Ludovico Panetta    schedule 01.03.2016

Насколько я знаю, в Laravel 5.1 вам нужно добавить следующий код в вашу модель, содержащую поле «activated_at».

protected $dates=['activated_at'];

И вам не нужны какие-либо методы получения для получения углеродного объекта, вы можете вызвать его функцию непосредственно в своем контроллере. Например, возьмите модель пользователя:

User::findOrFail(1)->activated_at->diffForHumans();
person yangwendaxia    schedule 27.11.2016