2014-11-17 8 views
5

ich eine benutzerdefinierte Lehre Art geschaffen haben, wie in http://doctrine-orm.readthedocs.org/en/latest/cookbook/working-with-datetime.html sagteSymfony2 Lehre benutzerdefinierte Typen unnötige Migrationen zu erzeugen

Hier ist der Code:

<?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; 
    } 
} 

Das Problem ist, wenn ich laufe app/console doctrine:migrations:diff es wird immer neue Migrationen erzeugen auch wenn ich migriert habe und der Inhalt immer gleich ist. Beispiel:

$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'); 

Antwort

7

Hier ist eine Antwort von Steve Müller von diesem Bug-Report: http://www.doctrine-project.org/jira/browse/DBAL-1085

Ich glaube, Sie werden Ihren benutzerdefinierten Typen als erfordern einen SQL Kommentar markieren müssen, sonst wird der Manager-Schemas kann nicht Unterscheiden Sie zwischen DateTime-Typ und Ihrem benutzerdefinierten Typ, da beide auf den gleichen systemeigenen SQL-Typ abgebildet werden.

Siehe hier: https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Types/Type.php#L327-L340

Sie das folgende zu Ihrem benutzerdefinierten Typ Implementierung hinzufügen:

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

Auch ich denke, es könnte erforderlich sein, Ihre benutzerdefinierten einen eindeutigen Namen geben wie zu geben:

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

Es Funktionen implementiert sind in doctrine> = 2.3

+1

Hinweis: Das Hinzufügen von 'requestsSQLCommentHint' löst das Problem nicht automatisch. 'Diff' ignoriert die Änderung. ** Sie müssen den Kommentar manuell hinzufügen. ** Ich habe ein Ticket dafür erstellt: http://www.doctrine-project.org/jira/browse/DBAL-1193 – vbence

+0

@vbence Link ist kaputt Weißt du ob das? Fehler wurde behoben? – josecelano

+0

@vence Wie kann ich den Kommentar manuell hinzufügen? Ich meine, welchen Text muss ich in den Kommentar schreiben? – josecelano

Verwandte Themen