如何从查询中按所需顺序获取参数?

时间:2018-09-05 07:49:00

标签: php mysql doctrine prepared-statement

我正在尝试执行本机查询,而不是在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

1 个答案:

答案 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()设置的参数的顺序。

我希望这会有所帮助。谢谢。