如何在Laravel/Lumen查询构造器中使用MySQL CONVERT_TZ函数?
解决Laravel/Lumen中CONVERT_TZ函数的时区引号参数问题
嘿,我来帮你搞定这个CONVERT_TZ的参数问题~其实核心原因是CASE WHEN里用到的是SQL原生的判断逻辑和数值,不需要引号包裹;但CONVERT_TZ的时区参数是字符串类型,必须用引号处理,下面给你两种可行的解决方式:
方式一:直接在DB::raw中添加转义引号
你可以直接在DB::raw()的字符串里,用转义单引号\'把时区参数包裹起来,这样Laravel编译SQL时会正确识别:
$result['tests'] = Test::select( 'test.test_id', DB::raw('convert_tz(test.updated_at, \'+00:00\', \'-05:30\') as updated_at'), 'test.created_at' ) ->orderBy('test.test_id', 'ASC') ->get() ->toArray();
方式二:参数绑定(更安全,适合动态时区)
如果你的时区参数是动态获取的(比如从配置、用户输入来),推荐用参数绑定的方式,既能自动处理引号,还能避免SQL注入风险:
$fromTimezone = '+00:00'; $toTimezone = '-05:30'; $result['tests'] = Test::select( 'test.test_id', DB::raw('convert_tz(test.updated_at, ?, ?) as updated_at'), 'test.created_at' ) ->setBindings([$fromTimezone, $toTimezone]) ->orderBy('test.test_id', 'ASC') ->get() ->toArray();
这样写就和你处理CASE WHEN的思路统一了——把动态/特殊参数单独处理,而不是硬写在原生SQL字符串里。
内容的提问来源于stack exchange,提问作者Sobin Augustine
相关产品推荐
相关产品推荐

