Doctrine_Query_Exception : Couldn’t get short alias for TableName
5 mars 2009 par: Benoit BonnevilleDans le Framework PhP Symfony, avec le moteur d’objet relationnel Doctrine, Vous utilisez addWhere() et obtenez ce message Internal Server Error lors d’une comparaison.
C’est normal , Doctrine à un peu de mal avec les guillemets. Explication ci après.
L’erreur
Voici l’erreur que vous avez certainement lors d’une comparaison de chaine de caractères en DQL (Doctrine Query Language, le SQL de Doctrine) :
500 | Internal Server Error | [Doctrine_Query_Exception|tag:Doctrine_Query_Exception] [Couldn't get short alias for|tag:Couldn't get short alias for] ** partie de votre clause where ** stack trace * at () in SF_ROOT_DIR\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Query\Abstract.php line 671 ... 668. } 669. 670. if ($tableName === null) { 671. throw new?Doctrine_Query_Exception("Couldn't get short alias for "?. $componentAlias); 672. } 673. 674. return $this->generateTableAlias($componentAlias, $tableName); * at Doctrine_Query_Abstract->getSqlTableAlias('*** your table name ***', null) in SF_ROOT_DIR\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Query\Abstract.php line 647 ... 644. */ 645. public function?getTableAlias($componentAlias, $tableName = null) 646. { 647. return $this->getSqlTableAlias($componentAlias, $tableName); 648. } etc ...
Vous trouverez ensuite beaucoup de référence a l’objet Doctrine_Query_Abstract qui sert à la gestion des requêtes doctrine.
Votre code Php
Vous avez essayé de faire une requête doctrine avec dans la close where une chaine de caractère contenant un point (a dot)
Par exemple :
Doctrine_Query::create()->from()->[addWhere|tag:addWhere]('email = "test@example.com" ');
Explication par l’exemple :
Quand Doctrine découpe la requête, il décompose les valeurs de la close Where en découpant les guillemets simple.
Si jamais vous utilisez des guillemets doubles :
Exemple : email = « test_will_failed@example.com »
Doctrine considère les doubles guillemets ( » ), appelé double quote, comme des caractères quelconque.
Par conséquent, le fait d’avoir un point ( . ) dans votre champ entraine l’incompréhension suivante :
Cela reviens à la condition SQL : table.champ (ou table.field )
Doctrine considère alors « test_will_failed@example comme votre table et com » comme le champ de votre table.
Pour corriger, il vous suffit d’utiliser des guillemets simple ( ‘ ), appelé simple quote, il considère qu’il s’agit bien d’une valeur de type chaine de caractères.
Dans le code de doctrine :
Voici le fichier incriminé dans Symfony :
SF_ROOT_DIR\lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Query\Condition.php
Voici le fichier Doctrine :
http://svn.doctrine-project.org/branches/1.1/lib/Doctrine/Query/Condition.php
Fonction : parseLiteralValue()
// check that value isn't a string if (strpos($value, '\'') === false) { .... } else { // string literal found }
Vous comprendrez aisément que les guillemets doubles ne sont pas gérés.