簡體   English   中英

在Doctrine 1.2中按生成的字段排序

[英]Ordering by a generated field in Doctrine 1.2

我正在使用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();

這是我得到的錯誤:

致命錯誤:/[REMOVED]/lib/doctrine/Doctrine/Query/Orderby.php:94中堆棧消息:#0 / [REMOVED] / lib / doctrine / Doctrine /中未捕獲的異常'Doctrine_Query_Exception',消息為“未知列標題” Query / Abstract.php(2077):Doctrine_Query_Orderby-> parse('a.title')#1 / [已刪除] /lib/doctrine/Doctrine/Query.php(1160):Doctrine_Query_Abstract-> _ processDqlQueryPart('orderby',Array )#2 / [已刪除] /lib/doctrine/Doctrine/Query.php(1126):Doctrine_Query-> buildSqlQuery(false)#3 / [已刪除] /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 / [REMOVED] / lib / doctrine / Doctrine /Query/Abstract.php(1001):Doctrine_Query_Abstract->_preQuery(Array)#6 / srv / web / museumfounda在第94行的/[REMOVED]/lib/doctrine/Doctrine/Query/Orderby.php中

與此類似的東西應該起作用:

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

這應該允許您像現在一樣使用ordering子句。 為了使它更好,您可以在Table類內創建查詢,並your constructed query from above傳遞your constructed query from above的值your constructed query from above以便於維護代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM