2009-10-14 13 views
5

Moje nasłuchiwanie jest częścią zachowania, które powinno usunąć wszystkie wypisane is_publikowane w klauzuli where dowolnego wywoływanego zapytania. Dodawanie części do klauzuli jest naprawdę łatwe, ale jak ją usunąć.Doctrine: Jak usunąć część klauzuli where z zapytania select wewnątrz detektora (preDqlSelect)?

Istnieje kilka funkcji, takich jak Doctrine_Query->removeDqlQueryPart('where'), , ale to usuwa pełną klauzulę dokąd, a ja potrzebuję tylko części 'is_published = ?' do usunięcia.

Jednak mogłem poradzić sobie z tym ręcznie w jakiś sposób, z regex czy coś takiego. Ale najtrudniejszą częścią jest, jak usunąć parametr reprezentowany przez "?" z odpowiedniej tablicy parametrów (możliwe do odzyskania przez Doctrine_Query->getRawParams()).

Więc pytam, czy jest czysty sposób, aby przekształcić ten rodzaj zapytania:
...FROM Video v WHERE v.is_published = ? AND v.start_date < ? AND v.end_date > ?

tego uproszczoną jeden i nie brudząc się params reprezentowane przez znaki zapytania:
...FROM Video v WHERE v.start_date < ? AND v.end_date > ?

Jest to oczywiście prosty przykład, moje zapytania są nieco bardziej złożone. Niestety utknąłem z doktryną 1.0.x ze względu na framework symfony.

Odpowiedz

6

Wywołanie $query->getDqlPart('where') zwróci array z części gdzie klauzuli jak zostały one dodane przez where(), andWhere() itp funkcji. Możesz go użyć do znalezienia i usunięcia pożądanej części.

Następnie musisz radzić sobie z parametrami. Podczas jazdy rowerem po miejscach, w których trzeba znaleźć wszystko? i policzyć je i pamiętać numerów dla każdego z nich możesz usunąć, a następnie zadzwonić $params = $query->getParams(); i gdzie parametry klauzula będzie $params['where'] więc można je usunąć stamtąd, a następnie zadzwonić $query->setParams($params);

5

Based Joshua Coady Odpowiedź

$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

Dzięki za to. Przykłady idą bardzo długo :) – Aeolun

+0

ciesz się i ciesz :) –

+0

To rozwiązanie działa dla klauzuli "where", ale nie na przykład klauzuli "groupBy": W tym przypadku getParts() powinno zostać zastąpione przez: ... $ qb_group_by_part = $ qb-> getDqlPart ('groupBy'); $ qb_group_by_part = isset ($ qb_group_by_part ["parts"])? $ qb_group_by_part ["parts"]: array(); .. – Tsounabe