当我在select子句中的子查询中使用命名参数时,我收到此错误:
参数号无效:绑定变量数与令牌数不匹配
如果我使用QueryBuilder重写查询,可能会出现此错误。但我喜欢看我的风格的DQL语句:
$dql = 'SELECT u,
(SELECT count(e1.id)
FROM FrontendBundle:Entrega e1
JOIN e1.usuario u1
WHERE u1.id = u.id
AND e1.programa = :programaId) AS numentregas
FROM FrontendBundle:Usuario u
WHERE EXISTS (SELECT mat FROM FrontendBundle:Matricula mat
WHERE mat.centro = :centroId
AND mat.usuario = u.id)
';
$consulta = $this->getEntityManager()->createQuery($dql);
$consulta->setParameter('programaId', $programaId);
$consulta->setParameter('centroId', $centroId);
我总是使用这种代码结构。但在这种情况下,当我在select-subquery中使用“:programaId”时,我得到了错误。
但是,令人惊讶的是,where-subselect中的“:centroId”可以使用。
不要试图分析完整的选择,我已经削减了一些不重要的部分。 谢谢
答案 0 :(得分:0)
如果你想在不使用查询构建器的情况下运行查询,我建议使用php内置的PDO:
http://php.net/manual/en/book.pdo.php
try {
$sql = 'SELECT u,
(SELECT count(e1.id)
FROM FrontendBundle:Entrega e1
JOIN e1.usuario u1
WHERE u1.id = u.id
AND e1.programa = :programaId) AS numentregas
FROM FrontendBundle:Usuario u
WHERE EXISTS (SELECT mat FROM FrontendBundle:Matricula mat
WHERE mat.centro = :centroId
AND mat.usuario = u.id)';
$sth = $this->getEntityManager()->getConnection()->prepare($sql);
$sth->bindParam(':programaId', $programaId);
$sth->bindParam(':centroId', $centroId);
$sth->execute();
return $sth->fetchAll();
} catch (\PDOException $e) {
return false;
}