Laravel:如何用Query Builder替代原生参数化SQL并绑定参数
解决方案
在Laravel Query Builder中,你可以通过where方法直接添加条件,框架会自动完成参数化绑定,不需要手动写:pid这类占位符。
修改后的完整代码如下:
$objects = DB::table('projects', 'p') ->select( 'o.id AS oid', 'o.name AS name', 'o.fields AS fields' ) ->join('tasks as t', 't.project_id', '=', 'p.id') ->leftJoin('commands as c', 'c.task_id', '=', 't.id') ->leftJoin('objects as o', 'o.id', '=', 'c.object_id') // 添加WHERE条件,Laravel自动处理参数化 ->where('p.id', $row->pid) ->groupBy(['o.id', 'o.name']) ->orderBy('o.name') ->get(); // 调用get()执行查询并获取结果集
补充说明
- 参数化安全:直接传入
$row->pid即可,Laravel会自动将其转换为参数化查询,和原生SQL里的:pid绑定效果完全一致,能有效防止SQL注入。 - 简化写法:如果是等于条件,可省略第三个参数,直接写成
->where('p.id', $row->pid),默认就是等于操作。 - 手动指定占位符(可选):如果一定要用命名占位符的写法,也可以用
whereRaw:
->whereRaw('p.id = :pid', ['pid' => $row->pid])
不过这种写法没必要,普通的where方法已经足够简洁安全。
内容的提问来源于stack exchange,提问作者vbulash
相关产品推荐
相关产品推荐

