Как установить существующее свойство как свойство даты в Laravel? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть поля start_date и end_date на одной из моих моделей.

В течение некоторого времени мы сохраняли эти свойства как Carbon даты без использования свойства $dates:

start_date: {
    date: "2016-09-28 00:00:00.000000",
    timezone_type: NumberLong("1"),
    timezone: "-04:00"
},
end_date: {
    date: "2016-09-30 00:00:00.000000",
    timezone_type: NumberLong("1"),
    timezone: "-04:00"
}

Я хотел бы использовать свойство $dates в Laravel и преобразовать их в Carbon даты.

Однако Laravel не оценит, когда я просто добавлю их всвойство:

protected $dates = ['start_date', 'end_date'];

А затем попытайтесь преобразовать их:

foreach($models as $model) {
    $model->start_date = new Carbon($model->start_date);
    $model->end_date = new Carbon($model->end_date);
    $model->save();
}

При возникновении ошибки на Accesssor:

exception: "ErrorException"
file: "/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php"
line: 760
message: "preg_match() expects parameter 2 to be string, array given"

Есть мысли?

1 Ответ

0 голосов
/ 16 ноября 2018

Массив $dates используется только для приведения строки даты / даты и времени, хранящейся в базе данных, в экземпляр Carbon при загрузке.Вы не можете сохранить экземпляр Carbon в базе данных напрямую, сначала вы должны вызвать что-то вроде toDateTimeString() в экземпляре Carbon и сохранить эту строку.

https://laravel.com/docs/5.7/eloquent-mutators#date-mutators

РЕДАКТИРОВАТЬ: я вижуВаш комментарий, что вы сохранили свои даты в базе данных в виде массивов?Возможно, вам потребуется написать собственный аксессор, чтобы конвертировать их в даты Carbon, поскольку Carbon анализирует только строки.

Ознакомьтесь с документацией Laravel о том, как написать аксессор: https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor

...