Упорядочение по сгенерированному полю в Doctrine 1.2 - PullRequest
0 голосов
/ 04 сентября 2010

Я использую функцию обратного вызова 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

1 Ответ

1 голос
/ 04 сентября 2010

Что-то похожее на это должно работать:

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

Это должно позволить вам использовать ваше предложение заказа, как вы это делаете сейчас.Чтобы сделать его более приятным, вы можете создать запрос внутри класса Table и передать значения из your constructed query from above, чтобы облегчить поддержку кода.

...