setParameter不替换通配符?

时间:2012-12-18 11:37:35

标签: php symfony doctrine-orm

我一直在浪费相当多的时间来弄清楚为什么我不能在Symfony 2中的Doctrine Query对象上使用setParameter方法。

我创建了一个自定义存储库类,我想添加一些自定义搜索方法/查找器。

我已经尝试了很多不同的构建DQL的组合,并且在每种情况下它都不会替换我指定的通配符。我希望这是我错过的一些显而易见的东西,但我有点困惑,而不是。

// Repository class

namespace Acme\PurchaseOrderBundle\Entity;

use Doctrine\ORM\EntityRepository;

class PurchaseOrderRepository extends EntityRepository
{
    public function findAllFiltered($sortType = 'id', $sort = 'ASC', $offset = 1, $limit = 30)
    {
        //Variation 1
        $query = $this->getEntityManager()
        ->createQuery('
                      SELECT po FROM AcmePurchaseOrderBundle:PurchaseOrder po
                      WHERE po.id = ?1'
        );
        $query->setParameter(1, 1);

        return $query->getDql();    

        // Yields: SELECT po FROM AcmePurchaseOrderBundle:PurchaseOrder po WHERE po.id = ?1

        //Variation 2
        $query = $this->getEntityManager()
        ->createQuery('
                      SELECT po FROM AcmePurchaseOrderBundle:PurchaseOrder po
                      WHERE po.id = :value'
        );

        $query->setParameter('value', 1);

        return $query->getDql();
        // Yields: SELECT po FROM AcmePurchaseOrderBundle:PurchaseOrder po WHERE po.id = :value
    }
}

我开始使用QueryBuilder,但这也遇到了同样的问题,我无法获取参数来保存!这真是太奇怪和令人沮丧。

我正在使用Symfony 2.1.5-DEV

1 个答案:

答案 0 :(得分:3)

这就是预处理语句的工作方式 - getDQL()返回准备好的语句。要获取您需要执行的参数

$query->getParameters();

Doctrine传递预准备语句和执行参数,但不发送查询。