我试图执行本机查询,而不要在queryBuilder之后修改SQL查询。所以我通过查询
$queryBuilder->getQuery()->getSQL()
我的查询看起来像这样
SELECT p0_.id AS id_0 FROM ptable p0_ WHERE p0_.code = ? AND p0_.item_id IN (?)
但
$parameters = $queryBuilder->getQuery()->getParameters()
返回参数的顺序是它们被添加了,但在SQL查询中却没有出现。是否存在以正确顺序获取参数的方法?
参数大致类似于
['code', [1,2,3]]
或[[1,2,3], 'code']
-顺序取决于添加顺序。***更新。我要做什么
$newParameters = [];
foreach ($queryBuilder->getQuery()->getParameters() as $parameter) {
$newParameters[count($newParameters) + 1] = $parameter->getValue();
}
$nativeQuery =
$this->_em
->createNativeQuery('SELECT count(*) countItem FROM ('.$queryBuilder->getQuery()->getSQL().') tmp', $rsm)
->setParameters($newParameters);// params order does matter
最佳答案
我一看到您的问题,便提出了一个测试用例,并做了几次您尝试做的事情。但是,我并没有像您一样获得随机订单。
您在使用任何框架还是在使用Doctrine?下面的示例在Symfony 2.8中使用Doctrine。
使用createQueryBuilder()
$qb = $em->createQueryBuilder()
->select('p.id')
->from('ABCBundle:PTable', 'p')
->where('p.name = :p_name')
->setParameter('p_name', 'Test Data')
->andWhere('p.order IN (:p_order)')
->setParameter('p_order', array(4,5,6))
->getQuery();
这个
print_r($qb->getSQL());
和print_r($qb->getParameters());
给我以下结果,并且一直都是一致的,SELECT f0_.id AS ID0 FROM p_table f0_ WHERE f0_.name = ? AND f0_.order IN (?)Doctrine\Common\Collections\ArrayCollection Object
(
[elements:Doctrine\Common\Collections\ArrayCollection:private] => Array
(
[0] => Doctrine\ORM\Query\Parameter Object
(
[name:Doctrine\ORM\Query\Parameter:private] => name
[value:Doctrine\ORM\Query\Parameter:private] => Test Data
[type:Doctrine\ORM\Query\Parameter:private] => 2
)
[1] => Doctrine\ORM\Query\Parameter Object
(
[name:Doctrine\ORM\Query\Parameter:private] => order
[value:Doctrine\ORM\Query\Parameter:private] => Array
(
[0] => 4
[1] => 5
[2] => 6
)
[type:Doctrine\ORM\Query\Parameter:private] => 101
)
)
)
使用createNativeQuery()
$sql = 'SELECT p.id AS ID0 FROM p_table p WHERE p.name = :name AND p.order IN (:order)';
$rsm = new \Doctrine\ORM\Query\ResultSetMapping();
$query = $em->createNativeQuery($sql, $rsm);
$query->setParameter('name', 'Test Data');
$query->setParameter('corder', array(4,5,6));
print_r($query->getSQL());
print_r($query->getParameters());
上面的顺序将始终是使用
setParameter()
设置的参数的顺序。我希望这有帮助。谢谢。