2015-09-04 1 views
3

Tout d'abord, je suis très nouveau à kohana, mais j'ai une grande expérience avec plus populaire Yii & Yii2.kohana i18n errorException avec constructeur de requête (kohana-> leap-> mssql)

Je travaille avec une configuration compliquée, qui appelle la base de données MsSQL à partir du modèle de saut en utilisant le constructeur de requête. Maintenant, j'ai dû optimiser le code, mais je me suis retrouvé avec une erreur, c'est difficile à résoudre moi-même.

Les demandes à la base de données MsSQL sont séparées en 2 parties. Voici sous_requête, qui exécute comme il se doit:

$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); 

Mais la prochaine requête doit interroger des données de la première:

$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(')'); 

Mais si le premier bloc me donne un résultat, en appelant la deuxième me donne une erreur qui est liée à ... echm ... traduction ??? ...:

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

Je ne peux pas comprendre cela du tout. Je suppose que dans un endroit une erreur de syntaxe est apparue et le constructeur ne peut pas résoudre cela, mais je ne peux que deviner & google ... S'il vous plaît aidez-moi à comprendre la nature de ce personnel ...!?

Up: fait dump var de la chaîne, qu'il essaie de traduire, et a obtenu la chaîne d'erreur)):

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" 

Peut-être que tout le monde ... Je vois que la requête est très Stange. Devrait-il y avoir "[" & "]" dans SQL ...?

Répondre

0

Voici l'erreur:

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

devrait être:

->from($leap_subquery, 'VP')

et ne pas exécuter $leap_subquery