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 ...?