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

1cosmwyk  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(314)

我正在尝试在querybuilder之后执行nativequeryvie修改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
ctehm74n

ctehm74n1#

当我看到你的问题,我做了一个测试用例,做了很多次你想做的事情。但是,我没能像你一样随机订购。
你是在使用任何框架,还是在使用开箱即用的原则?下面的示例使用symfony 2.8中的条令。
使用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() .
我希望这有帮助。谢谢。

相关问题