Doctrine Query Builder не регистрирует параметр?

У меня есть следующий код, который вызывает исключение Invalid parameter number: number of bound variables does not match number of tokens. Тем не менее, когда я печатаю зарегистрированные параметры, мой параметр отображается.

public function getUnitPriceFor($entityType,$entityID,$qty,$configuration_id)
{
    $this->qb = $this->getEntityManager()->createQueryBuilder();
    $this->qb   ->select($this->_entities[$entityType]['select'])
                // for Base this would be ->select(array('t','c','w','g'))
                // for the other cases below, like website, it's array('t','w')
                ->from('AcmeBundle:PriceTier', 't');

    switch($entityType) :
        case 'base' :
            $this->qb   ->leftJoin('t.customers','c')
                        ->leftJoin('t.customergroups','g')
                        ->leftJoin('t.websites','w');
        break;
        case 'website' :
            $this->qb   ->join('t.websites','w','WITH','w.id = '.$entityID);
        break;
        case 'custgrp' :
            $this->qb   ->join('t.customergroups','g','WITH','g.id = '.$entityID);
        break;
        case 'cust' :
            $this->qb   ->join('t.customers','t','WITH','t.id = '.$entityID);
        break;
    endswitch;

    $this->qb           ->where('t.printconfiguration = :configuration_id');
    $this->qb           ->setParameter('configuration_id', $configuration_id);

    print_r( $this->qb->getParameters() );

    $dql = $this->qb->getDQL();

    echo"<pre>";
    print_r($this->getEntityManager()->createQuery($dql)->getArrayResult());
    echo"</pre>";
}

Печать $this->qb->getParameters(); показывает мне Array ( [configuration_id] => 1 ), а удаление моих предложений параметров where и set предотвращает возникновение исключения. Наконец, (и получайте это), если я удалю предложение where, но оставлю набор параметров, исключения не произойдет. Я довольно смущен.


person Nick    schedule 10.11.2011    source источник
comment
Исключение возникает для каждого случая или только для определенных? Кроме того, вы пытались передать $configuration_id непосредственно в предложение WHERE, а не использовать setParameter()?   -  person cantera    schedule 10.11.2011
comment
Ах, в других случаях были бы семантические ошибки из-за оператора select - я исправил это, и да, все еще исключение для любого случая. Я попробовал where('t.printconfiguration = :configuration_id')->setParameter('configuration_id', $configuration_id);, и все равно произошло то же исключение. Я мог бы передать его напрямую, как я сделал в операторах case, но это в значительной степени противоречит цели использования PDO...   -  person Nick    schedule 10.11.2011
comment
Рад, что вы нашли свой ответ. Не могли бы вы объяснить, что вы подразумеваете под поражением цели использования PDO? Я не спорю - я просто передал свои параметры напрямую, чтобы сохранить небольшой код, и мне любопытно, есть ли причина, по которой мне не следует этого делать. С удовольствием обсудим в чате, если будет проще.   -  person cantera    schedule 11.11.2011
comment
Вышеупомянутая функциональность в основном используется для подготовленных операторов и хранимых процедур. Он также имеет некоторую встроенную защиту от SQL-инъекций. Вот отрывок из руководства по PHP о подготовленных операторах. Наконец, этот небольшой учебник содержит раздел о заполнителях.   -  person Nick    schedule 14.11.2011


Ответы (1)


Видимо $dql = $this->qb->getDQL(); не будет передавать параметры.

мне нужно было изменить

$dql = $this->qb->getDQL();

echo"<pre>";
print_r($this->getEntityManager()->createQuery($dql)->getArrayResult());
echo"</pre>";

в

$query = $this->qb->getQuery();

echo"<pre>";
print_r($query->getArrayResult());
echo"</pre>";
person Nick    schedule 10.11.2011