Blog / Article #19
Requetes SQL natives avec doctrine

star

24 Janvier 2013

Requetes sql natives avec doctrine

Requetes SQL natives avec doctrine

 Il se peut parfois que pour une bonne raison personnelle on refuse d'utiliser le QueryBuilder de Doctrine dans un projet Symfony2.X à la faveur d'une requête native. C'est souvent injustifié car au fil du temps on s’aperçoit qu'on pouvait faire autrement en grattant un peu dans la doc. Hélas des fois on a pas la tête à lire/traduire et on regrette nos bonnes vieilles requêtes maison, si claires à comprendre et si simple à débugguer... 

 

Heureusement, ils ont quand même pensé à ces cas de figures et nous permettent de récupérer un objet de connexion correspondant aux infos de conf, notamment celles qui concernent doctrine.dbal.driver. Dans mon cas j'utilise le driver pdo_mysql, c'est donc une instance de l'objet PDO qui me sera retournée par le manager Doctrine.

Un exemple simple

// Récupération de l'instance de l'objet de connexion Doctrine 
$con = Doctrine_Manager::getInstance()->connection();  

Ensuite il suffit juste de récupérer le retour de l’exécution d'une requête par cet Objet.

$st = $con->execute("SELECT * FROM ETC ETC ETC...");  

Et récupérer tout le contenu de la déclaration reçue, comme on l'aurait fait autrefois avec nos vieux objets PDO, puisqu'au fond, cela en est un !  :)

$result = $st->fetchAll();  

Et avec des paramètres ?

Un autre exemple avec des paramètres sur une requête combinée  basique.

$db = Doctrine_Manager::getInstance()->connection();  
$query = $db->prepare("INSERT INTO MATABLE (nom,prenom,compteur) 
                       VALUES (:nom, 'Oliver',1) 
                       ON DUPLICATE KEY UPDATE compteur=compteur+1;");  
$query->execute(array('nom' => 'Guivernal')); 

Bon par contre, a l'inverse de doctrine, les retours ne seront jamais des objets ! Ces "requêtes manuelles" sont donc pratiques pour de l'insertion ou de l'update mais pas pour de la récupération, vu que vous ne pourrez pas travailler sur une entité correspondante sans en créer une instance hydratée avec les infos reçues...
Ce n'est pas impossible mais pas très académique :)

Voila quelques docs à lire pour vous aider a choisir "la bonne façon" de procéder :


Cet article est terminé, veuillez appuyer sur +1

Auteur de l'article
Retour a la liste