2010-09-03 17 views
0

J'utilise un rappel preDqlSelect() pour ajouter un "champ virtuel". Mais la validation de ma requête doit avoir lieu avant que le rappel ne soit déclenché car je ne peux pas commander par ce nouveau champ lorsque j'interroge ce modèle.Classement par champ généré dans Doctrine 1.2

Voici mon rappel:

class Artist extends BaseArtist 
{ 
    public function preDqlSelect(Doctrine_Event $event) 
    { 

     // Add title field (concatenation of first_name, last_name, and company fields) 
     $params = $event->getParams(); 
     $q = $event->getQuery(); 
     $a = $params['alias']; 
     if (
     $q->contains($a.'.first_name') 
     && $q->contains($a.'.last_name') 
     && $q->contains($a.'.company') 
     ) { 
      $exists = '!ISNULL(NULLIF('.$a.'.%s, \'\'))'; 
      $value = 'IFNULL('.$a.'.%1$s, \'\')'; 
      $if = sprintf($exists, 'first_name').' OR '.sprintf($exists, 'last_name'); 
      $thenPiece1 = sprintf($value, 'first_name').', \' \', '.sprintf($value, 'last_name'); 
      $thenPiece2 = 'IF('.sprintf($exists, 'company').', CONCAT(\' (\', '.sprintf($value, 'company').', \')\'), \'\')'; 
      $then = 'TRIM(CONCAT('.$thenPiece1.', '.$thenPiece2 .'))'; 
      $else = sprintf($value, 'company'); 
      $select = 'IF('.$if.', '.$then.', '.$else.') AS title'; 
      $q->addSelect($select); 
     } 
    } 
// ... 

Et voici ma question:

$artists = Doctrine_Query::create() 
    ->select('a.id, a.first_name, a.last_name, a.company') 
    ->from('Artist a') 
    ->innerJoin('a.Products p') 
    ->where('a.active <> 0') 
    ->andWhere('p.active <> 0') 
    ->orderBy('a.title') 
    ->execute(); 

Voici l'erreur que je reçois:

Erreur fatale: Uncaught exception 'Doctrine_Query_Exception' message ' Titre de colonne inconnu 'dans /[REMOVED]/lib/doctrine/Doctrine/Query/Orderby.php:94 Stack trace: # 0 /[REMOVED]/lib/doctrine/Doctrine/Query/Abstract.php(2077): Doctrine_Query_Orderby- > par se ('a.title') # 1 /[REMOVED]/lib/doctrine/Doctrine/Query.php(1160): Doctrine_Query_Abstract -> _ processDqlQueryPart ('orderby', tableau) # 2/[SUPPRIMÉ]/lib/doctrine/Doctrine/Query.php (1126): Doctrine_Query-> buildSqlQuery (false) # 3 /[REMOVED]/lib/doctrine/Doctrine/Query/Abstract.php(1137): Doctrine_Query-> getSqlQuery (Array, false) # 4/[SUPPRIMÉ] /lib/doctrine/Doctrine/Query/Abstract.php (1106): Doctrine_Query_Abstract -> _ getDqlCallbackComponents (Array) # 5 /[REMOVED]/lib/doctrine/Doctrine/Query/Abstract.php(1001): Doctrine_Query_Abstract- > _preQuery (Array) # 6/srv/web/museumfounda dans /[REMOVED]/lib/doctrine/Doctrine/Query/Orderby.php en ligne 94

Répondre

1

Quelque chose de semblable à cela devrait fonctionner:

->select('a.id, a.first_name, a.last_name, a.company, IF(your constructed query from above) AS title') 

Cela devrait vous permettre d'utiliser votre clause de commande comme vous le faites maintenant. Pour le rendre plus agréable, vous pouvez créer la requête à l'intérieur d'une classe Table et transmettre les valeurs de your constructed query from above afin que le code soit facile à maintenir.

+0

Wow, ça a marché comme un charme. Et avec moins de code. – mattalxndr