Laravel查询构建器左连接时整数参数被反引号包裹的问题
解决Laravel左连接中数值被加反引号的问题
这个问题我之前在项目里也碰到过,Laravel查询构建器的on方法默认会把你传入的所有值都当作表字段来处理,所以才会给你的整数1加上反引号,导致数据库把它识别成列名而非数值。下面给你两个靠谱的解决办法:
方法一:使用DB::raw()明确指定原生数值
直接用DB::raw()包裹你的动态ID,告诉查询构建器这是原生SQL内容,不是字段名:
->leftJoin('tbluserprivileges', function ($join) use ($id) { $join->on('tblprivileges.id', '=', 'tbluserprivileges.PrivilegeID'); $join->on('tbluserprivileges.UserID', '=', DB::raw((int)$id)); })
这样生成的SQL就会是你想要的:
select `tblprivileges`.`id`, `tblprivileges`.`Description`, `tbluserprivileges`.`UserID` from `tblprivileges` left join `tbluserprivileges` on `tblprivileges`.`id` = `tbluserprivileges`.`PrivilegeID` and `tbluserprivileges`.`UserID` = 1
方法二:用where替代第二个on(更推荐,安全防注入)
在join的闭包中使用where方法来添加用户ID的条件,Laravel会自动处理参数绑定,既不会加反引号,还能避免SQL注入风险:
->leftJoin('tbluserprivileges', function ($join) use ($id) { $join->on('tblprivileges.id', '=', 'tbluserprivileges.PrivilegeID'); $join->where('tbluserprivileges.UserID', '=', $id); })
这种方式生成的SQL会用参数占位符,执行时自动替换为对应数值:
select `tblprivileges`.`id`, `tblprivileges`.`Description`, `tbluserprivileges`.`UserID` from `tblprivileges` left join `tbluserprivileges` on `tblprivileges`.`id` = `tbluserprivileges`.`PrivilegeID` and `tbluserprivileges`.`UserID` = ?
简单说下原理:on方法是用来定义表与表之间的关联字段关系,所以它默认认为两边都是字段;而where方法是用来添加过滤条件,会自动区分字段和普通值,帮你做好参数绑定。
内容的提问来源于stack exchange,提问作者flrurgqtxpptpltger
相关产品推荐
相关产品推荐

