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
Wow, ça a marché comme un charme. Et avec moins de code. – mattalxndr