Doctrine:如何从侦听器中的select查询中删除where子句的一部分(preDqlSelect)?

时间:2009-10-14 17:01:27

标签: php doctrine listener behavior

我的侦听器是行为的一部分,应该删除任何被调用的select查询的where子句中的所有is_published检查。在子句中添加一个部分非常简单,但如何删除一个。

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

对于这个被剥离的那个并且没有弄乱由问号代表的参数:
...FROM Video v WHERE v.start_date < ? AND v.end_date > ?

这当然只是一个简单的例子,我的查询有点复杂。 不幸的是,由于symfony框架,我坚持使用doctrine 1.0.x.

2 个答案:

答案 0 :(得分:7)

调用$query->getDqlPart('where')将返回where子句的array个部分,因为它们是通过where()andWhere()等函数添加的。因此,您可以使用它来查找和删除所需的部分。

然后你必须处理这些参数。骑自行车穿过你需要找到的所有部位?并计算它们并记住您删除的任何数字,然后调用$params = $query->getParams();并将where子句参数放在$params['where']中,以便您可以从那里删除它们然后调用$query->setParams($params);

答案 1 :(得分:7)

基于Joshua Coady回答

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