Doctrine_Query_Exception : Couldn’t get short alias for TableName

5 mars 2009 par: Benoit Bonneville

Dans 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.

Filed under: Développement

Répondre