2009-10-14 1 views
5

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

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

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

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

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

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

ответ

6

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

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

5

Based Джошуа Коуди Ответ

$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')); 
+0

Спасибо за это. Примеры идут длинный путь :) – Aeolun

+0

наслаждайтесь и наслаждайтесь :) –

+0

Это решение работает для предложения where, но не для примера: «groupBy»: в этом случае getParts() следует заменить на: ... $ qb_group_by_part = $ qb-> getDqlPart ('groupBy'); $ qb_group_by_part = isset ($ qb_group_by_part ["parts"])? $ qb_group_by_part ["parts"]: array(); .. – Tsounabe

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