Eu uso consulta parametrizada no 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;
Então eu uso isso em loop como$objects = DB::select($objectsSQL, ['pid' => $row->pid]);
Por enquanto, quero evitar o uso de SQL bruto e substituí-lo pelo Query Builder:
$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')
e então como vincular :pid
?
Ah, entendi o que você quer dizer, você está tentando ter essa mesma consulta definida e então executá-la com valores $pid diferentes. Como o
addBinding
método do construtor de consultas altera o objeto, você precisaria ter um retorno de chamada ou uma função que faça a consulta (opção 1) ou retorne o construtor de consultas sem o:pid
valor vinculado a ele (opção 2).Você pode simplesmente adicionar uma chamada encadeada à
where()
função:O Laravel vinculará automaticamente o
$pid
valor quando gerar uma instrução preparada com base na chamada do construtor.Código atualizado: