$theTitle=wp_title(" - ", false); if($theTitle != "") { ?>
De izzetali UNLU dans Technique
3 avr 2013Objectif : Réussir à faire une requête insensible aux accents en DQL avec Doctrine 2.
Pour nous aider dans notre tâche nous avions trouvé un article très intéressant évoquant sur comment réussir une requête insensible aux accents sur ORACLE :
1 2 3 |
select prenom
from emp
where convert(prenom,'US7ASCII','WE8MSWIN1252') like '%heloise%' ; |
Problématique rencontré : Lorsque nous avons voulu faire appel à la fonction CONVERT native de ORACLE via Doctrine 2 avec l’exemple ci-dessus, une erreur était générée car Doctrine 2 n’avait pas cette fonction définie dans son environnement
Code PHP impliqué :
public function rechercheByThemes($params){
try{
$qb = $this->_em->createQueryBuilder();
return $qb->select('t')
->from('PROJECTMYBundle:Theme', 't')
->where('t.supprime = 0 and (LOWER(CONVERT(t.libelle, :param1, :param2)) like LOWER(CONVERT(:texte, :param1, :param2)) or LOWER(CONVERT(t.memo, :param1, :param2)) like LOWER(CONVERT(:texte, :param1, :param2)))')
->setParameter('texte', '%'.$params['texte'].'%')
->setParameter('param1', 'US7ASCII')
->setParameter('param2', 'WE8MSWIN1252')
->getQuery()
->getArrayResult()
;
}
catch(\Doctrine\ORM\NoResultException $e){
return null;
}
}
Erreur PHP obtenue :
[Syntax Error] line 0, col 70: Error: Expected known function, got ‘CONVERT’
Solution : déclarer la fonction CONVERT native de ORACLE dans l’environnement de Doctrine 2.
Ensemble des fichiers qui seront modifiés dans l’environnement Doctrine 2 :
\vendor\doctrine\dbal\lib\Doctrine\DBAL\Platforms\OraclePlatform.php
\vendor\doctrine\orm\lib\Doctrine\ORM\Query\Parser.php
Nouveau fichier qui sera créé dans l’environnement Doctrine 2 :
\vendor\doctrine\orm\lib\Doctrine\ORM\Query\AST\Functions\ConvertFunction.php
Procédure :
1 – OraclePlatform.php :
public function getConvertExpression($stringOne, $stringTwo, $stringThree)
{
return 'CONVERT(' . $stringOne . ', ' . $stringTwo . ', ' . $stringThree . ')';
}
2 – ConvertFunction.php :
namespace Doctrine\ORM\Query\AST\Functions;
use Doctrine\ORM\Query\Lexer;
class ConvertFunction extends FunctionNode
{
public $stringOne;
public $stringTwo;
public $stringThree;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return $sqlWalker->getConnection()->getDatabasePlatform()->getConvertExpression(
$sqlWalker->walkSimpleArithmeticExpression($this->stringOne),
$sqlWalker->walkSimpleArithmeticExpression($this->stringTwo),
$sqlWalker->walkSimpleArithmeticExpression($this->stringThree)
);
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringOne = $parser->StringPrimary();
$parser->match(Lexer::T_COMMA);
$this->stringTwo = $parser->StringPrimary();
$parser->match(Lexer::T_COMMA);
$this->stringThree = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
Nous avons 2 méthodes dans cette classe :
3 – Parser.php :
private static $_STRING_FUNCTIONS = array(
…
'convert' => 'Doctrine\ORM\Query\AST\Functions\ConvertFunction',
…
);