Мой слушатель является частью поведения, которое должно удалить все регистрации is_published где пункт любого названного запроса Select. Добавление части к пункту действительно легко, но как удалить тот.
Существуют некоторые функции как Doctrine_Query->removeDqlQueryPart('where')
, но это удаляет полное, где пункт, в то время как мне только нужно 'is_published = ?'
часть, которая будет удалена.
Однако я мог обработать это вручную так или иначе с regex или чем-то. Но хитрая часть, как удалить параметр, представленный'?' от соответствующего массива параметров (восстановимый 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 > ?
Это - конечно, просто простой пример, мои запросы немного более сложны. К сожалению, я застреваю с доктриной 1.0.x из-за платформы симфонии.
Вызов $query->getDqlPart('where')
вернет массив
частей предложения where, добавленных с помощью функций where()
, andWhere()
и др. Таким образом, вы можете использовать это для поиска и удаления нужной вам части.
Затем нужно разобраться с параметрами. При циклическом просмотре частей where вам нужно будет найти все параметры, посчитать их и запомнить номера для всех удаленных, а затем вызвать $params = $query->getParams();
, а параметры пункта where будут в $params['where']
, так что вы можете удалить их оттуда, а затем вызвать $query->setParams($params);