Я использую функцию обратного вызова preDqlSelect (), чтобы добавить «виртуальное поле». Но проверка моего запроса должна произойти до того, как обратный вызов будет запущен, потому что я не могу упорядочить по этому новому полю, когда запрашиваю эту модель.
Вот мой обратный звонок:
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);
}
}
// ...
А вот мой запрос:
$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();
Вот ошибка, которую я получаю:
Неустранимая ошибка: необработанное исключение «Doctrine_Query_Exception» с сообщением «Неизвестный заголовок столбца» в /[REMOVED]/lib/doctrine/Doctrine/Query/Orderby.php:94 трассировке стека: # 0 / [REMOVED] / lib / doctrine /Doctrine/Query/Abstract.php(2077): Doctrine_Query_Orderby-> parse ('a.title') # 1 /[REMOVED]/lib/doctrine/Doctrine/Query.php(1160): Doctrine_Query_Abstract -> _ orderDql ', Array) # 2 /[REMOVED]/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 /[REMOVED]/lib/doctrine/Doctrine/Query/Abstract.php(1106): Doctrine_Query_Abstract -> _ getDqlCallbackComponents (Array) # 5 / [Rray doctrine / Doctrine / Query / Abstract.php (1001): Doctrine_Query_Abstract -> _ preQuery (Array) # 6 / srv / web / museumfounda в /[REMOVED]/lib/doctrine/Doctrine/Query/Orderby.php в строке 94