请教:将给定MySQL语句转换的Query Builder是否正确?
你的Query Builder代码和原MySQL语句是否匹配?
先把两段代码摆出来对比更清楚:
原MySQL语句:
SELECT YEAR(`UNIT`.sold_date) AS SOLD_YEAR FROM pams_unit AS `UNIT` WHERE `UNIT`.status_id=3 AND YEAR(`UNIT`.sold_date)>=2012 GROUP BY SOLD_YEAR
你写的Query Builder代码:
$year = DB::table('pams_unit') ->selectRaw('year(sold_date) as year') ->where([ ['status_id', '=', '3'], ['year(sold_date)', '>=', '2012'], ]) ->groupBy('year');
直接说结论:这段Query Builder代码在功能逻辑上完全等价于原MySQL语句,只是有两个小细节的写法差异,完全不影响正确性:
- 别名命名:原SQL把年份别名设为
SOLD_YEAR,你用的是year,但只要selectRaw里的别名和groupBy里的引用一致,就没问题,逻辑上都是按销售年份分组。 - 表别名:原SQL给
pams_unit加了UNIT的别名,你的Query Builder没加,但因为只操作单张表,不会出现字段歧义,所以这个差异不影响查询结果。
另外补充一点:where条件里用year(sold_date)的写法,和原SQL完全一致,虽然这种写法可能无法利用sold_date字段的索引(属于性能优化范畴),但从语法和功能正确性来说,是完全匹配原SQL的。
内容的提问来源于stack exchange,提问作者Ho Wei Kang
相关产品推荐
相关产品推荐

