我正在尝试执行本机查询,而不是在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
答案 0 :(得分:0)
我很快看到您的问题,就做了一个测试用例,并做了几次您想做的事情。但是,我并没有像您一样获得随机订单。
您正在使用任何框架还是正在使用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()
设置的参数的顺序。
我希望这会有所帮助。谢谢。