我在 Laravel 中使用参数化查询:
$objectsSQL = <<<'EOS'
SELECT
o.id AS oid,
o.name AS name,
o.fields AS fields
FROM projects p
JOIN tasks AS t ON t.project_id = p.id
LEFT JOIN commands AS c ON c.task_id = t.id
LEFT JOIN objects AS o ON o.id = c.object_id
WHERE p.id = :pid
GROUP BY o.id, o.name
ORDER BY o.name
EOS;
然后我在循环中使用它$objects = DB::select($objectsSQL, ['pid' => $row->pid]);
现在我想避免使用原始 SQL 并用查询生成器替换它:
$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')
**what to do here to use `:pid`? (WHERE p.id = :pid)**
->gropupBy(['o.id', 'o.name'])
->orderBy('o.name')
然后如何绑定:pid
?
啊,我明白你的意思了,你试图定义这个相同的查询,然后使用不同的 $pid 值运行它。由于查询生成器的
addBinding
方法会改变对象,因此你需要有一个回调或函数来执行查询(选项 1)或返回没有绑定到它的值的查询生成器:pid
(选项 2)。您可以简单地向函数添加链式调用
where()
:$pid
Laravel 将在基于构建器调用生成准备好的语句时自动绑定该值。更新的代码: