我试图执行本机查询,而不要在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()设置的参数的顺序。

我希望这有帮助。谢谢。

07-24 09:38
查看更多