Doctrine: Как удалить часть предложения where из выбранного запроса внутри прослушивателя (preDqlSelect)?

Мой слушатель является частью поведения, который должен удалить все is_published проверки в предложении where любого вызываемого запроса select. Добавление части в предложение очень просто, но как ее удалить.

Существуют некоторые функции, такие как Doctrine_Query->removeDqlQueryPart('where') , но это устраняет предложение complete where, в то время как мне нужно только 'is_published = ?' часть должна быть удалена.

Однако я мог бы как-то справиться с этим вручную, с регулярным выражением или что-то в этом роде. Но сложная часть заключается в том, как удалить параметр, представленный символом '?' из соответствующего массива параметров (извлекается Doctrine_Query->getRawParams() ).

Поэтому я спрашиваю, есть ли чистый способ преобразования такого запроса:
...FROM Video v WHERE v.is_published = ? AND v.start_date < ? AND v.end_date > ?

к этому разделил один и без испортить параметры, представленные вопросительными знаками:
...FROM Video v WHERE v.start_date < ? AND v.end_date > ?

Это, конечно, простой пример, мои запросы немного сложнее. К сожалению, я придерживаюсь doctrine 1.0.x из-за рамки symfony.

Вызов $query->getDqlPart('where') вернет array частей предложения where, поскольку они были добавлены через функции where() , andWhere() и т. Д. Таким образом, вы можете использовать это, чтобы найти и удалить нужную деталь.

Тогда вам придется иметь дело с параметрами. Пока вы едете на велосипеде по тем частям, которые вам нужно найти? и подсчитайте их и запомните числа для любого из $params = $query->getParams(); вами, а затем вызовите $params = $query->getParams(); и параметры where where будут в $params['where'] чтобы вы могли удалить их там, а затем вызвать $query->setParams($params);

Основанный Джошуа Коуди Ответ

  $qb = <query builder>; $qb_where_part = $qb->getDqlPart('where')->getParts(); $qb->resetDQLPart('where'); // we know by dumping that it is an and operator in our case, generic way shoud take op in account //var_dump($qb->getDqlPart('where')); foreach ($qb_where_part as $where_clause) { if ('o.date > :date_debut' === $where_clause) continue; $qb->andWhere($where_clause); } $params = $qb->getParameters(); $new_date_fin = null; foreach ($params as $key => $param) { if ($param->getName() === 'date_debut') { $new_date_fin = $param->getValue(); $params->remove($key); } if ($param->getName() === 'date_fin' && $new_date_fin) { $param->setValue($new_date_fin); //var_dump($param->getValue()); } } $qb->setParameters($params); var_dump($qb->getParameters()); var_dump($qb->getDqlPart('where'));