Мой слушатель является частью поведения, который должен удалить все 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'));