You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:32:33