Я использую Doctrine 2.2 с php 5.3 на сервере Apache.
До сих пор я наткнулся на следующую проблему: когда я пытаюсь обновить столбец datetime, я получаю: SQLSTATE [22007]: [Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Не удалось конвертировать при конвертировании даты и / или времени из символьной строки.
Я даже зашел так далеко, чтобы попасть в столбец, а затем использовать его, добавив только один день, чтобы установить новую дату …… тот же результат.
Когда я вместо этого изменяю как столбец в базе данных, так и в сущности от даты и времени до даты, он работает по назначению.
Моя основная проблема заключается в том, что есть несколько полей, где мне НЕОБХОДИМО использовать столбец datetime.
Вот мой код:
(дата рождения была столбец, который я изменил на сегодняшний день …. и является одним из немногих столбцов, где это возможно для меня):
//This returns the datetime object that represents birthdate from the database $help=$object->getBirthDate(); $help->setTimestamp(mktime($time[0],$time[1],$time[2],$date[2],$date[1],$date[0])); $help->format(\DateTime::ISO8601); $object->setBirthDate($help);
Кто-нибудь знает об этом?
Любая помощь здесь очень ценится.
Его официальная ошибка в Доктрине 2.2, которая будет решена в 2.3.
Микросекунды выдаются в строку с неправильным количеством нулей.
Обход проблемы: измените функцию convertToDatabaseValue в файле /Doctrine/DBAL/Types/DateTimeType.php:
public function convertToDatabaseValue($value, AbstractPlatform $platform) { if( $value === null) return null; $value = $value->format($platform->getDateTimeFormatString()); if( strlen($value) == 26 && $platform->getDateTimeFormatString() == 'Ymd H:i:su' && ($platform instanceof \Doctrine\DBAL\Platforms\SQLServer2008Platform || $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2005Platform ) ) $value = substr($value, 0, \strlen($value)-3); return $value; }
Я столкнулся с этой проблемой с Doctrine 2.5 и SQL Server 2012. Проблема в том, что поле базы данных является типом DATETIME
, но doctirne поддерживает только DATETIME2
на платформе SQLServer2008 и выше.
Вам не следует редактировать файлы в каталоге поставщика. Правильный ответ заключается в создании настраиваемого типа: пользовательские типы отображения Doctrine . В моем случае я расширил текущий DateTimeType:
<?php namespace AppBundle\Doctrine\Type; use Doctrine\DBAL\Types\DateTimeType; use Doctrine\DBAL\Platforms\AbstractPlatform; class DateTime extends DateTimeType { private $dateTimeFormatString = 'Ymd H:i:s.000'; public function convertToDatabaseValue($value, AbstractPlatform $platform) { return ($value !== null) ? $value->format($this->dateTimeFormatString) : null; } }
А затем в Symfony config.yml:
types: datetime: AppBundle\Doctrine\Type\DateTime
Какую ценность вы передаете в поле datetime
? Вы должны передать экземпляр Datetime
$entity->setDate(new \Datetime());