Когда я пытаюсь получить список объектов модели Eloquent в формате JSON от моего контроллера Laravel, я сталкиваюсь с ошибкой:
InvalidArgumentException in Carbon.php line 393:
Trailing data
Соответствующие части трассировки стека:
1. in Carbon.php line 393
2. at Carbon::createFromFormat('Y-m-d H:i:s', '2015-04-20 18:07:13.769') in Model.php line 2889
3. at Model->asDateTime('2015-04-20 18:07:13.769') in Model.php line 2392
4. at Model->attributesToArray() in Model.php line 2371
Кажется, что корень моей проблемы в том, что при сериализации модели в JSON она пытается проанализировать значение одного из столбцов метки времени, чтобы создать объект Carbon (который, я полагаю, затем будет преобразован обратно в строку), но он использует неправильный формат.
Строка формата исходит от Model::getDateFormat()
который по умолчанию:
$this->getConnection()->getQueryGrammar()->getDateFormat()
и оказывается 'Y-m-d H:i:s'
вместо того, что дает PostgreSQL, который 'Y-m-d H:i:s.u'
(или что-то, не уверенный, взаимозаменяемы ли миллисекунды и микросекунды, как это). Конечно, можно просто переопределить getDateFormat()
во всех моих модельных классах, но это раздражает (и не совсем подходит для этого, поскольку модель должна быть достаточно независимой от базы данных), даже если я просто хочу, чтобы все они наследовали от базового класса. Есть ли способ установить формат даты грамматики запроса вместо этого? Похоже, это должно быть возможно через файл конфигурации базы данных, но я не смог найти ничего в документации по этому поводу.
Не совсем через конфигурационные файлы БД, но вы могли бы посоветовать Postgres вообще не сохранять миллисекунды в базе данных:
ALTER TABLE {tablename} ALTER updated_at SET DATA TYPE timestamp(0) without time zone;
Другой вариант — переопределить класс PostgresGrammar и его метод getDateFormat (), но он не работал для меня на laravel 4.2.
Других решений пока нет …