2015-09-04 27 views
3

首先,我對kohana很新,但是我對YiiYii2有很大的經驗。kohana i18n errorException with query builder(kohana-> leap-> mssql)

我正在處理複雜的配置,它使用查詢生成器從跳躍模型調用MsSQL數據庫。現在我不得不優化代碼,但遇到一個錯誤,這很難解決我自己。

對MsSQL數據庫的請求分爲兩部分。下面是子查詢,執行,因爲它應該:

$leap_subquery = DB_SQL::select($this->data_source()) 
     ->column('lg.SessionID','SESSION_ID') 
     ->column(DB_SQL::expr("CAST(DATEADD(HOUR, 3, lg.MsgTimestamp) AS DATE)"),'ACTIVITY_DT') 
     ->column(DB_SQL::expr("CAST(DATEADD(HOUR, 3, lg.MsgTimestamp) AS TIME(0))"),'ACTIVITY_TM') 
     ->column(DB_SQL::expr("RIGHT(REPLACE(cr.ORIGINATINGNUMBER,'tel:',''),10)"),'PHONE_NUM') 
     ->column(DB_SQL::expr("RIGHT(REPLACE(cr.DESTINATIONNUMBER,'tel:',''),5)"),'DESTINATION_NUM') 
     ->column(DB_SQL::expr("CAST(CASE 
      WHEN UPPER(lg.ActivityName) = 'VDUID' THEN lg.VarValue 
      ELSE NULL 
      END AS VARCHAR(50))"),'CALL_ID') 
     ->column(DB_SQL::expr("CASE 
      WHEN UPPER(LEFT(lg.ActivityName,21)) = 'КАЧЕСТВО_ОБСЛУЖИВАНИЯ' 
       THEN CAST(RIGHT(lg.ActivityName,1) AS NUMERIC) 
      ELSE NULL 
     END"),'SERVICE_QUALITY') 
     ->column(DB_SQL::expr("CASE 
      WHEN UPPER(LEFT(lg.ActivityName,15)) = 'СКОРОСТЬ_ОТВЕТА' 
       THEN CAST(RIGHT(lg.ActivityName,1) AS NUMERIC) 
      ELSE NULL 
     END"),'RESPONSE_SPEED') 
     ->column(DB_SQL::expr("CASE 
      WHEN UPPER(LEFT(lg.ActivityName,12)) = 'ВОПРОС_РЕШЁН' AND RIGHT(lg.ActivityName,1) = '1' THEN 1 
      WHEN UPPER(LEFT(lg.ActivityName,12)) = 'ВОПРОС_РЕШЁН' AND RIGHT(lg.ActivityName,1) = '2' THEN 0 
      ELSE NULL 
     END"),'QUESTION_SOLUTION') 
     ->column(DB_SQL::expr("CASE 
      WHEN UPPER(LEFT(lg.ActivityName,18)) = 'ДОБРОЖЕЛАТЕЛЬНОСТЬ' 
       THEN CAST(RIGHT(lg.ActivityName,1) AS NUMERIC) 
      ELSE NULL 
     END"),'AMIABILITY') 
     ->column(DB_SQL::expr("CASE 
      WHEN UPPER(LEFT(lg.ActivityName,7)) = 'ЯСНОСТЬ' 
       THEN CAST(RIGHT(lg.ActivityName,1) AS NUMERIC) 
      ELSE NULL 
     END"),'CLEARNESS') 
     ->column(DB_SQL::expr("CASE 
      WHEN UPPER(LEFT(lg.ActivityName,14)) = 'ВНИМАТЕЛЬНОСТЬ' 
       THEN CAST(RIGHT(lg.ActivityName,1) AS NUMERIC) 
      ELSE NULL 
     END"),'ATTENTION') 
    ->from('VPStats.dbo.VPAppLog','lg') 
    ->join('INNER','VPStats.dbo.CDR','cr')->on('cr.SESSIONID','=','lg.SessionID') 
    ->where(DB_SQL::expr("CAST(DATEADD(HOUR, 3, lg.MsgTimestamp) AS DATE)"), '=', DB_SQL::expr("CAST('".$date."' AS DATE)")) 
    ->where(DB_SQL::expr("UPPER(lg.ApplicationID)"), '=', 'QUALITY') 
    ->where_block('(') 
     ->where(DB_SQL::expr("UPPER(LEFT(lg.ActivityName,21))"), '=', 'КАЧЕСТВО_ОБСЛУЖИВАНИЯ' ) 
     ->where(DB_SQL::expr("UPPER(LEFT(lg.ActivityName,15))"), '=', 'СКОРОСТЬ_ОТВЕТА', 'OR') 
     ->where(DB_SQL::expr("UPPER(LEFT(lg.ActivityName,12))"), '=', 'ВОПРОС_РЕШЁН',  'OR') 
     ->where(DB_SQL::expr("UPPER(LEFT(lg.ActivityName,18))"), '=', 'ДОБРОЖЕЛАТЕЛЬНОСТЬ', 'OR') 
     ->where(DB_SQL::expr("UPPER(LEFT(lg.ActivityName,7))"), '=', 'ЯСНОСТЬ',   'OR') 
     ->where(DB_SQL::expr("UPPER(LEFT(lg.ActivityName,14))"), '=', 'ВНИМАТЕЛЬНОСТЬ',  'OR') 
     ->where(DB_SQL::expr("UPPER(lg.ActivityName)"),   '=', 'VDUID',    'OR') 
    ->where_block(')') 
    ->statement(FALSE); 

但下次查詢應查詢從第一個一些數據:

$leap_query = DB_SQL::select($this->data_source()) 

     ->column(DB_SQL::expr("MAX(VP.ACTIVITY_DT"),     'date'  ) 
     ->column(DB_SQL::expr("MAX(VP.ACTIVITY_TM"),     'time'  ) 
     ->column(DB_SQL::expr("MAX(VP.PHONE_NUM)"),     'number' ) 
     ->column(DB_SQL::expr("MAX(VP.SERVICE_QUALITY)"),    'answer_1' ) 
     ->column(DB_SQL::expr("MAX(VP.QUESTION_SOLUTION)"),   'answer_2' ) 
     ->column(DB_SQL::expr("MAX(VP.RESPONSE_SPEED)"),    'answer_3' ) 
     ->column(DB_SQL::expr("MAX(VP.AMIABILITY)"),     'answer_4' ) 
     ->column(DB_SQL::expr("MAX(VP.CLEARNESS)"),     'answer_5' ) 
     ->column(DB_SQL::expr("MAX(VP.ATTENTION)"),     'answer_6' ) 
     ->column(DB_SQL::expr("MAX(VP.DESTINATION_NUM)"),    'skill'  ) 
     ->column(DB_SQL::expr("MAX(VP.CALL_ID)"),      'call_id' ) 


    ->from(DB::expr("(".$leap_subquery.")"), 'VP') 
    ->group_by(array('VP.SESSION_ID')) 
    ->having(DB_SQL::expr("MAX(CALL_ID)"), 'IS NOT', NULL) 
    ->having_block('(') 
     ->having(DB_SQL::expr("MAX(VP.SERVICE_QUAILITY)"), 'IS NOT', NULL  ) 
     ->having(DB_SQL::expr("MAX(VP.RESPONSE_SPEED)"), 'IS NOT', NULL, 'OR') 
     ->having(DB_SQL::expr("MAX(VP.QUESTION_SOLUTION)"), 'IS NOT', NULL, 'OR') 
     ->having(DB_SQL::expr("MAX(VP.AMIABILITY)"),  'IS NOT', NULL, 'OR') 
     ->having(DB_SQL::expr("MAX(VP.CLEARNESS)"),   'IS NOT', NULL, 'OR') 
     ->having(DB_SQL::expr("MAX(VP.ATTENTION)"),   'IS NOT', NULL, 'OR') 
    ->having_block(')'); 

但在第一塊給我一個結果,調用第二個給我一個與...相關的錯誤... echm ...翻譯??? ...:

ErrorException [ Notice ]: Array to string conversion 
SYSPATH/classes/kohana/i18n.php [ 164 ] 
return empty($values) ? $string : strtr($string, $values); 

我完全不明白。我猜在某些地方出現了語法錯誤,建設者無法解決這個問題,但我只能猜測&谷歌...請幫助我瞭解這個工作人員的性質......!

最多:做字符串的VAR轉儲,它試圖翻譯,並得到了錯誤的字符串)):

function __($string, array $values = NULL, $lang = 'en-us') 
{ 
      var_dump($string, $values, $lang);die(); 
    ....... 
    return empty($values) ? $string : strtr($string, $values); 
} 

string(55) "Message: Failed to query SQL statement. Reason: :reason" array(1) { ':reason' => array(5) { [0] => string(5) "00000" [1] => int(0) [2] => string(3276) "(null) [0] (severity 0) [SELECT MAX(VP.ACTIVITY_DT AS [date], MAX(VP.ACTIVITY_TM AS [time], MAX(VP.PHONE_NUM) AS [number], MAX(VP.SERVICE_QUALITY) AS [answer_1], MAX(VP.QUESTION_SOLUTION) AS [answer_2], MAX(VP.RESPONSE_SPEED) AS [answer_3], MAX(VP.AMIABILITY) AS [answer_4], MAX(VP.CLEARNESS) AS [answer_5], MAX(VP.ATTENTION) AS [answer_6], MAX(VP.DESTINATION_NUM) AS [skill], MAX(VP.CALL_ID) AS [call_id] FROM (SELECT [lg].[SessionID] AS [SESSION_ID], CAST(DATEADD(HOUR, 3, lg.MsgTimestamp) AS DATE) AS [ACTIVIT"... [3] => int(0) [4] => int(0) } } string(5) "en-us" 

也許任何人......我看到查詢看起來非常STANGE。 SQL中是否應該有「[」&「]?...?

回答

0

這裏是錯誤:

->from(DB::expr("(".$leap_subquery.")"), 'VP')

應該是:

->from($leap_subquery, 'VP')

,不執行$leap_subquery