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

问题描述 投票:1回答:1

我试图在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
php mysql doctrine prepared-statement
1个回答
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()设置的参数顺序。

我希望这有帮助。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.