Symfony/Doctrine: DateTime as primary key Symfony/Doctrine: DateTime as primary key symfony symfony

Symfony/Doctrine: DateTime as primary key


A roubust solution to this is to implement your own DBAL type, using a DateTime descendant with __toString() implemented:

<?phpclass DateKey extends \DateTime{    function __toString() {        return $this->format('c');    }    static function fromDateTime(\DateTime $dateTime) {        return new static($dateTime->format('c'));    }}class DateKeyType extends \Doctrine\DBAL\Types\DateType{    public function convertToPHPValue($value, \Doctrine\DBAL\Platforms\AbstractPlatform $platform) {        $value = parent::convertToPHPValue($value, $platform);        if ($value !== NULL) {            $value = DateKey::fromDateTime($value);        }        return $value;    }    public function getName()    {        return 'DateKey';    }}\Doctrine\DBAL\Types\Type::addType('datekey', 'DateKeyType');//edit: do not forget this after creating entity manager.//otherwise, you will get into problems with doctrine database diff / migrations.$platform = $entityManager->getConnection()->getDatabasePlatform();$platform->registerDoctrineTypeMapping('datekey', 'datekey');$platform->markDoctrineTypeCommented(\Doctrine\DBAL\Types\Type::getType('datekey'));


I had the same problem here. I worked around it by using this:

/** * @var string * * @ORM\Id * @ORM\Column(type="string") */private $date;/** * @return \DateTime */public function getDate(){    return \DateTime::createFromFormat('Y-m-d|', $this->date);}/** * @param \DateTime $date */public function __construct(\DateTime $date){    $this->date = $date->format('Y-m-d');}

if you want to use datetime, you should use a different format like \DateTime::ISO8601. Be careful at saving stuff with timezones.


You probably should just use a normal sequence.

However, if you must use calendar information to key, you might want to store it as a 'string' type and then use php's DateTime Format:

 $currentData->setDate(new \DateTime($dateStr)->format('yyyy/mm/dd');

You are probably headed for misery if you try to use a datetime object for key.