I am trying to make an Entity using a date as a primary key. The problem is that Symfony can\'t convert the DateTime I\'m using into a string to introduce it in the Identity
A roubust solution to this is to implement your own DBAL type, using a DateTime descendant with __toString() implemented:
<?php
class 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.