Doctrine 2 et ORACLE : Utilisation du type datetime

De izzetali UNLU dans Technique

28 juin 2013

La possibilité de gérer le type DATE d’Oracle avec l’ORM Doctrine 2 n’est pas configurée par défaut.
Ceci nécessite une configuration simple comme expliqué dans cet article.

Voici ci-dessous le mapping d’un champ de type datetime côté Doctrine 2 et Date côté ORACLE :

PHP
1
2
3
4
5
6
/**
* @var datetime $dateEnregistrement
*
* @ORM\Column(name="DATE_ENREGISTREMENT", type="datetime")
*/
private $dateEnregistrement;</strong>

Lorsque ce champ est utilisé dans le code source de l’application une exception ORACLE est levée :
Could not convert database value “17-NOV-11 12.17.33 AM” to Doctrine Type datetime. Expected format: Y-m-d H:i:s

 

Code source de l’application :

PHP
1
2
3
4
5
$reservation = new Reservation(); // Initialisation de l'entité
$now = new \Datetime(); // Création de l'objet datetime
$reservation->setDateEnregistrement($now); // Set du champ de type datetime
$this->_em->persist($reservation); // Persistance de l'entité
$this->_em->flush();// Flush et exécution de la requête

Comment contourner ce problème ?
Il faut préciser l’appel du service ORACLE, dans le fichier de configuration de Symfony 2 config.yml situé dans le répertoire app/config :

XHTML
1
2
3
4
5
services:
my.listener:</strong>
class: Doctrine\DBAL\Event\Listeners\OracleSessionInit
tags:</strong>
- { name: doctrine.event_listener, event: postConnect }

Vous ne devriez alors plus rencontrer ce problème.

2 Réponses pour Doctrine 2 et ORACLE : Utilisation du type datetime

Avatar

Laurent Callarec

octobre 11th, 2013 à 16 h 24 min

Merci d’avoir partagé cette méthode ;)

J’ajouterai cependant une chose : la méthode postConnect du listener sera exécuté pour toutes les connections ouvertes. Si, comme dans mon cas, on a une connexion vers un SGBD autre qu’Oracle, on peut (et on doit) préciser sur quelle connexion sera exécuté la méthode :

- { name: doctrine.event_listener, event: postConnect, connection: default }

Avatar

unlu

octobre 25th, 2013 à 16 h 55 min

Merci pour cette précision !

Commentaire

six + = 15

iMDEO recrute !

REJOIGNEZ-NOUS

A la recherche de nouveaux talents (développeurs web et mobile, chefs de projet,...)

Voir les annonces