2016-01-12 3 views
3

У меня проблема с моим построителем запросов. Я использую symfony. То, что я хочу выполнить: у меня есть заданный построитель запросов, и я хочу подсчитать все строки на основе этого запроса. Таким образом, я работал над следующим раствором:Как удалить параметры из построителя запросов?

$aliases = $queryBuilder->getRootAliases(); 
$alias = array_values($aliases)[0]; 

$cloneQueryBuilder = clone $queryBuilder; 
$from = $cloneQueryBuilder->getDQLPart('from'); 

$cloneQueryBuilder->resetDQLParts(); 

$newQueryBuilder = $cloneQueryBuilder 
    ->select('count(' . $alias . '.id)') 
    ->add('from', $from[0]); 

$this->total = $newQueryBuilder->getQuery()->getSingleScalarResult(); 

Однако им получает исключение: Too many parameters: the query defines 0 parameters and you bound 1 Кто-нибудь знает, как решить эту проблему?

ответ

6

Вызов setParameters должен переписать все существующие параметры.

+0

Отлично! почему я об этом не думал. так просто xD – Vardius

+0

Это правда? Насколько я могу судить, setParameters только обновляет значения существующих параметров или добавляет новые. Кажется, я не могу найти какой-либо метод для удаления параметра из QueryBuilder после его добавления. См. Http://www.doctrine-project.org/api/orm/2.2/source-class-Doctrine.ORM.QueryBuilder.html#354 –

+0

hm, 'ORM \ QueryBuilder' и не переопределяет. 'DBAL \ Query \ QueryBuilder'overrides. Зависит от того, что вы используете. Для справки: [ORM] (http://www.doctrine-project.org/api/orm/2.2/source-class-Doctrine.ORM.QueryBuilder.html#337-364), [DBAL] (http: // www.doctrine-project.org/api/dbal/2.3/source-class-Doctrine.DBAL.Query.QueryBuilder.html#_setParameters) – Joshua

0

Я не верю, что приведенный выше ответ верен. Как вы можете видеть, setParameters только обновляет существующие параметры. Он не удаляет любое, которые уже установлены:

http://www.doctrine-project.org/api/orm/2.2/source-class-Doctrine.ORM.QueryBuilder.html#354

Решения, которое я нашел, было перебирать существующие параметры и установите каждое значение NULL.

foreach($queryBuilder->getParameters() as $key=>$value){ 
    $queryBuilder->setParameter($key,null); 
} 
+0

На самом деле это тоже не работает. :(Насколько я могу сказать, это просто невозможно, если не добавлен дополнительный метод. –

+0

Я могу видеть вашу точку зрения, но как вы можете объяснить, что исключение, которое я получал раньше, исчезло с помощью решения @Joshua? – Vardius

+0

Ну, я не могу. :) Я рад, что это сработало для вас. –

Смежные вопросы