2014-11-17 2 views
5

я создал пользовательский тип доктрины, как сказано в http://doctrine-orm.readthedocs.org/en/latest/cookbook/working-with-datetime.htmlSymfony2 Doctrine пользовательские типы генерации ненужные миграции

Вот код:

<?php 

namespace XXX\Bundle\XXXBundle\Doctrine\Type; 

use Doctrine\DBAL\Platforms\AbstractPlatform; 
use Doctrine\DBAL\Types\ConversionException; 
use Doctrine\DBAL\Types\DateTimeType; 

class UTCDateTimeType extends DateTimeType 
{ 
    static private $utc = null; 

    public function convertToDatabaseValue($value, AbstractPlatform $platform) 
    { 
     if ($value === null) { 
      return null; 
     } 

     $value->setTimezone(new \DateTimeZone('UTC')); 
     $dbDate = $value->format($platform->getDateTimeFormatString()); 

     return $dbDate; 
    } 

    public function convertToPHPValue($value, AbstractPlatform $platform) 
    { 
     if ($value === null) { 
      return null; 
     } 

     $val = \DateTime::createFromFormat(
      $platform->getDateTimeFormatString(), 
      $value, 
      (self::$utc) ? self::$utc : (self::$utc = new \DateTimeZone('UTC')) 
     ); 
     if (!$val) { 
      throw ConversionException::conversionFailed($value, $this->getName()); 
     } 
     return $val; 
    } 
} 

Проблема заключается в том, когда я бегу app/console doctrine:migrations:diff он всегда будет генерировать новые миграции даже если я переместился, и контент всегда один и тот же. Пример:

$this->addSql('ALTER TABLE Availability CHANGE start start DATETIME NOT NULL, CHANGE end end DATETIME NOT NULL, CHANGE rrule rrule LONGTEXT DEFAULT NULL, CHANGE created created DATETIME NOT NULL, CHANGE updated updated DATETIME NOT NULL'); 

ответ

7

Вот ответ от Стива Мюллера из этого сообщения об ошибке: http://www.doctrine-project.org/jira/browse/DBAL-1085

Я думаю, что вы должны будете отмечать свой собственный тип, требующий SQL комментарий, в противном случае менеджер схема не может различайте Тип DateTime и свой собственный тип, потому что обе карты соответствуют одному родному SQL-типу.

Смотрите здесь: https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Types/Type.php#L327-L340

Вы должны добавить следующую строку в ваш пользовательский тип реализации:

/** 
* {@inheritdoc} 
*/ 
public function requiresSQLCommentHint(AbstractPlatform $platform) 
{ 
    return true; 
} 

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

/** 
* {@inheritdoc} 
*/ 
public function getName() 
{ 
    return 'datetime_utc'; 
} 

Там функции реализованы в doctrine> = 2.3

+1

Примечание: добавление 'requireSQLCommentHint' не решит проблему автоматически. 'Diff' будет игнорировать изменение. ** Вам нужно будет добавить комментарий вручную. ** Я создал билет для этого: http://www.doctrine-project.org/jira/browse/DBAL-1193 – vbence

+0

Ссылка @vbence сломана, вы знаете, если это исправлена ​​ошибка? – josecelano

+0

@vence как я могу «добавить комментарий вручную»? Я имею в виду, какой текст мне нужно добавить в комментарий? – josecelano

Смежные вопросы