2013-06-15 3 views
4

Я пытаюсь создать сущность с использованием даты в качестве первичного ключа. Проблема в том, что Symfony не может преобразовать DateTime, который я использую, в строку, чтобы ввести ее в IdentityMap. Я получаю следующее сообщение об ошибке во время сохраняются сущности:Symfony/Doctrine: DateTime как первичный ключ

Catchable Fatal Error: Object of class DateTime could not be converted to string in.. 

Я использую этот код в сущности:

/** 
* @ORM\Id 
* @ORM\Column(type="datetime") 
*/ 
protected $date; 

появляется ошибка в хранилище объекта:

$em = $this->getEntityManager(); 
$currentData = new CurrentData(); 
... 
$currentData->setDate(new \DateTime($dateStr)); 
... 
$em->persist($currentData); 
$em->flush(); 

Как я могу решить эту проблему? Спасибо.

+0

Вы бы лучше делать это таким образом: http://stackoverflow.com/questions/15080573/doctrine-2-orm-datetime-field-in-identifier – Ryall

ответ

1

Возможно, вы должны просто использовать обычную последовательность.

Однако, если вы должны использовать информацию календаря на ключ, вы можете сохранить его как тип «строка», а затем использовать в PHP DateTime Формат:

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

Вы, вероятно, направился к нищете, если вы пытаетесь для использования объекта datetime для ключа.

+0

Вы не должны предполагать, что нормальная последовательность более полезна или быстрее для его целей. Рекомендации, подобные этому, без знания его прецедентов, могут привести к плохой разработке базы данных. – Ryall

1

У меня была такая же проблема здесь. Я работал вокруг него с помощью этого:

/** 
* @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'); 
} 

, если вы хотите использовать DateTime, вы должны использовать другой формат, как \ DateTime :: ISO8601. Будьте осторожны при сохранении вещей с часовыми поясами.

4

roubust решение это реализовать свой собственный тип DBAL, используя потомок DateTime с __toString() реализованы:

<?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')); 
Смежные вопросы