L'ORM Doctrine 2 champ DateTime dans identificateur
Dans notre DB tables, nous les colonnes refID
et date
sont une clé primaire composite, avec un seul champ de l'identifiant être mappé sur un datetime
:
class corpWalletJournal
{
/**
* @ORM\Column(name="refID", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $refID;
/**
* @ORM\Column(name="date", type="datetime", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $date;
public function setRefID($refID)
{
$this->refID = $refID;
}
public function setDate(\DateTime $date)
{
$this->date = $date;
}
}
Si nous les décrire en une entité comme @ORM\Id ce code sera de retour exception "ne peut pas convertir datetime à la chaîne"...
$filter = array(
'date' => $this->stringToDate($loopData['date']),
'refID' => $loopData['refID']
));
$oCorpWJ = $this->em->getRepository('EveDataBundle:corpWalletJournal')->findOneBy($filter);
//...
$oCorpWJ->setDate($this->stringToDate($loopData['date']));
//...
Si nous décrivons corpWalletJournal#date
comme une simple colonne, le code fonctionne très bien. Pourquoi?
Comment pouvons-nous y faire face? Nous avons besoin à la fois d' date
et refID
dans la clé primaire.
AJOUTÉ:
J'ai donc créé une nouvelle classe
use \DateTime;
class DateTimeEx extends DateTime
{
public function __toString()
{
return $this->format('Y-m-d h:i:s');
}
}
Et d'un type nouveau pour elle
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Eve\DataBundle\Entity\Type\DateTimeEx;
class DateTimeEx extends Type
{
const DateTimeEx = 'datetime_ex';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'my_datetime_ex';
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return new DateTimeEx($value);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return $value->format('Y-m-d h:i:s');
}
public function getName()
{
return self::DateTimeEx;
}
public function canRequireSQLConversion()
{
return true;
}
}
Comment puis-je les utiliser dans l'entité?
Mon (édité) Type de Classe
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class DateTimeEx extends Type
{
const DateTimeEx = 'datetime_ex';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'my_datetime_ex';
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return $value;
}
public function getName()
{
return self::DateTimeEx;
}
}
OriginalL'auteur user1954544 | 2013-02-26
Vous devez vous connecter pour publier un commentaire.
ORM Doctrine 2 besoins de convertir les champs de l'identificateur de chaînes dans la
UnitOfWork
. Cela est nécessaire pour avoir laEntityManager
être en mesure de suivre les modifications apportées à vos objets.Etant donné que les objets de type
DateTime
ne pas nativement mettre en œuvre la méthode__toString
, en les convertissant à cordes n'est pas aussi simple que le moulage à cordes.Par conséquent, la valeur par défaut
date
,datetime
ettime
types ne sont pas pris en charge dans le cadre de l'identificateur.À traiter avec elle, vous devez définir votre propre type de champ personnalisé
mydatetime
mappé à votre propreMyDateTime
classe qui implémente__toString
. De cette façon, l'ORM peut gérer les identifiants également si elles contiennent des objets.Voici un exemple de la façon dont cette classe peut ressembler à:
Et voici un exemple de la façon dont la coutume DBAL type:
Puis vous l'enregistrez avec votre ORM de configuration pendant le bootstrap (dépend du framework que vous utilisez). Dans symfony, il est documenté sur le symfony doctrine de la documentation.
Après que, vous pouvez l'utiliser dans vos entités:
Vous n'avez qu'à étendre la
DateTime
classe avec votre propreclass MyDateTime extends \DateTime { public function __toString() { return $this->format('U'); } }
. J'ai mis à jour la réponse. Le reste est dans la doc (lien vers des types de champ personnalisés: docs.doctrine-project.org/projects/doctrine-dbal/en/latest/... )j'ai ajouté le code\classes de top post, pouvez-vous m'expliquer comment puis-je les utiliser?
J'ai ajouté un exemple complet
je l'ai eu, et il semble qu'il fonctionne! mais ont toujours la question. ne peut-on PAS créer une classe DateTimeEx? et de faire tout ce dont nous avons besoin dans le type de classe?
OriginalL'auteur Ocramius
Être prudent avec
Le fuseau horaire ne sera pas bonne. Vous devriez faire :
OriginalL'auteur Yann Schepens