2009-10-14 40 views
5

我的監聽器是行爲的一部分,應該刪除任何被調用的select查詢的where子句中的所有is_published檢查。將一個部分添加到子句中非常簡單,但是如何刪除它。學說:如何從listener(preDqlSelect)中的select查詢中刪除部分where子句?

有一些功能,如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 > ?

這當然只是一個簡單的例子,我的查詢有點複雜。 不幸的是我因爲symfony框架而陷入了教條1.0.x。

回答

6

調用$query->getDqlPart('where')將通過where(),andWhere()等函數添加where子句的部分的array。所以你可以使用它來查找和刪除你想要的部分。

然後你必須處理參數。在循環瀏覽哪些地方你需要找到所有的東西?和計數並記住這些數字對於任何你刪除的人,然後打電話$params = $query->getParams();和where子句參數將在$params['where']這樣你就可以從那裏刪除它們,然後調用$query->setParams($params);

5

基於約書亞科迪回答

$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 2015-12-28 06:14:45

+0

享受和享受:) – 2016-01-22 21:08:57

+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 2016-10-24 15:11:33