Laravel 6: я не понимаю мутаторов и аксессоров с датами - PullRequest
0 голосов
/ 22 марта 2020

Мой пользователь вводит дату в следующем формате: "д / м / ГЧ: i", например "22/03/2020 11:00".

Моя проверка в порядке: 'exam_date' => 'required|date_format:d/m/Y H:i',

У меня есть база данных Postgres, столбец типа для даты: timestamp(0) without time zone.

Так что, если я понял, мне нужно преобразовать дату, прежде чем вставить ее в таблицу. И я должен преобразовать его после прочтения, чтобы отобразить его в хорошем формате. Для этого у меня есть эти мутатор и метод доступа:

public function setExamDateAttribute($value): void
{
    $this->attributes['exam_date'] = DateTime::createFromFormat('d/m/Y H:i', $value);
}

public function getExamDateAttribute($value)
{
    return date_format( DateTime::createFromFormat('Y-m-d H:i', $value), 'd/m/Y H:i');
}

У меня есть эта ошибка:

date_format () ожидает, что параметр 1 будет DateTimeInterface, bool предоставлен

Другими словами, я не понимаю, как мутаторы и методы доступа работают с датами.

Ответы [ 2 ]

3 голосов
/ 22 марта 2020

Эта проблема не имеет ничего общего с мутатором и аксессором.

Проблема возникает из-за DateTime::createFromFormat('Y-m-d H:i', $value) return false;

Ваш столбец для даты timestamp, поэтому формат значения is Ymd H: i: s

DateTime::createFromFormat('Y-m-d H:i' не соответствует Y-m-d H:i:s,

Вам необходимо использовать Y-m-d H:i:s вместо Y-m-d H:i:

public function getExamDateAttribute($value)
{
    return date_format( DateTime::createFromFormat('Y-m-d H:i:s', $value), 'd/m/Y H:i');
}
0 голосов
/ 22 марта 2020

Вы можете использовать приведения для дат , bools, целых чисел и пользовательских (в laravel 7 ), а также можете форматировать дату в определении модели:

protected $dates = [
    'exam_date',
];

protected $dateFormat = 'Y-m-d H:i';

И при необходимости вы можете отформатировать его в шаблоне блейда:

<td>{{$exam->exam_date->format('Y-m-d H:i:s')}}</td>

Также ваш метод get должен быть примерно таким ( docs ):

public function getExamDateAttribute() // <-- No parameter
{
    return date_format( DateTime::createFromFormat('Y-m-d H:i', $this->exam_date), 'd/m/Y H:i'); //The value is in the model $this->exam_date
}

PS: ошибка возникает из-за того, что DateTime не может создать объект даты и возвращает FALSE , я думаю, это происходит потому, что получателю не нужен параметр и передается значение NULL ... отсюда ошибка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...