Laravel: как установить формат даты для кастомизации модели?

У меня в модели:

protected $casts = [
    'date' => 'date',
];

Есть ли у laravel возможность устанавливать формат приведения, например:

protected $casts = [
    'date' => 'date_format:d/m/yyyy',
];

?

РЕДАКТИРОВАНИЕ

Я попробовал это:

В модели:

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

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

protected $casts = [
    'driver_expiration'     => 'date',
];

Я сохранил дату (driver_expiration) как '01/012016 ', но дата была сохранена.

Документация по Laravel: https://laravel.com/docs/5.1/eloquent-mutators Сообщите нам, что $ dateFormat работает только для отметок времени ("create_at", "updated_at", "Удаленный_ат")

Ответы

Ответ 1

Вместо того, чтобы вводить формат даты, вы можете использовать мутаторы для установки формата, который вам нравится:

Например, если ваш столбец был назван date, вы можете добавить в свою модель следующую функцию:

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

setDateAttribute всегда находится в set[ColumnName]Attribute, используя CamelCase. date в $this->attributes['date'] должна также соответствовать фактическому имени столбца в таблице.

Когда вы create или update запись в своей базе данных, формат будет автоматически изменен функцией выше.

Примечание. Возможно, вам понадобится добавить инструкцию use Carbon\Carbon в начало вашей модели, чтобы использовать библиотеку Carbon.

Взгляните на другие примеры.


ОБНОВИТЬ

При желании вы можете определить формат столбцов date используя:

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

Ответ 2

После laravel 5.6,

Вы можете индивидуально настроить формат яркой даты и дат-времени:

protected $casts = [
    'birthday'  => 'date:Y-m-d',
    'joined_at' => 'datetime:Y-m-d H:00',
];

Этот формат используется, когда модель сериализуется в массив или данные JSON

Ответ 3

Просто добавьте в модель:

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

этот метод Eloquent первоначально возвращает экземпляр Carbon, поэтому вы можете получить этот экземпляр и вызвать его метод format(). Если вы хотите применить это решение ко всем моделям, просто создайте новый класс, расширенный от Eloquent, и поместите туда этот метод, чтобы затем расширить модели из этого нового класса.

Ответ 4

Я создаю новое свойство модели:

protected $datesConvert = ['driver_expiration'];

И затем я обновил базовую модель:

public function save(array $options = [])
{
    if(isset($this->datesConvert)){
        foreach($this->datesConvert as $date){
            $this->attributes[$date] = \Carbon\Carbon::createFromFormat('d/m/Y', $this->attributes[$date])->format('Y-m-d');
        }
    }

    parent::save($options);

}

public function getAttribute($key)
{
    $value = parent::getAttribute($key);

    if(isset($this->attributes[$key])){
        if(isset($this->datesConvert)  &&  in_array($key, $this->datesConvert)){
            $value = \Carbon\Carbon::createFromFormat('Y-m-d', $value)->format('d/m/Y');
        }

    }

    return $value;
}

и это решение работает для меня. Код может быть перенесен в свойство. Формат можно поместить в $ dateConvert Format = 'd/m/Y';

Ответ 5

Объекты Collection не влияют на приведение типов. Используется для форматов json и array. Если вам нужен индивидуальный актерский состав, который вы можете использовать

 $user->date->format('m-d-Y');