简体   繁体   English

kohana i18n errorException with query builder(kohana-> leap-> mssql)

[英]kohana i18n errorException with query builder (kohana->leap->mssql)

First of all, I'm very new to kohana, but I have huge experience with more popular Yii & Yii2. 首先,我对kohana很新,但我对更受欢迎的Yii和Yii2有着丰富的经验。

I'm working with complicated configuration, that calls MsSQL database from leap model using query builder. 我正在使用复杂的配置,使用查询构建器从leap模型调用MsSQL数据库。 Now I had to optimize code but stuck with an error, that is hard to resolve myself. 现在我不得不优化代码但是遇到了错误,这很难自己解决。

Requests to MsSQL Database are separated in 2 parts. 对MsSQL数据库的请求分为两部分。 Here is subquery, that executes as it should: 这是子查询,它应该执行:

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

But next query should query some data from the first one: 但是下一个查询应该从第一个查询一些数据:

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

But if the first block gives me a result, calling the second one gives me an error that is connected with ...echm... translation??? 但是如果第一个块给了我一个结果,那么调用第二个块会给我一个与...相关的错误...翻译??? ... : ......:

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

I can not understand that at all. 我根本无法理解。 I guess that in some place a syntax error appeared and builder can not resolve this, but I can only guess & google ... Please help me to understand the nature of this staff... !? 我想在某些地方出现语法错误,生成器无法解决这个问题,但我只能猜测和谷歌...请帮助我了解这个工作人员的性质......!?

Up: made var dump of the string, that it is trying to translate, and got the string of error)) : Up:对字符串进行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"

Maybe anyone...I see that the query looks very stange. 也许任何人......我看到查询看起来非常危险。 Should there be "[" & "]" in SQL...? SQL中应该有“[”&“]”吗?

Here is error: 这是错误:

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

Should be: 应该:

->from($leap_subquery, 'VP')

and don't execute $leap_subquery 并且不执行$leap_subquery

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM