6

我的侦听器是行为的一部分,它应该删除任何调用的 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 框架,我坚持使用学说 1.0.x。

4

2 回答 2

8

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

然后你必须处理参数。骑自行车时,您需要找到所有零件吗?并计算它们并记住您删除然后调用的任何数字的数字,$params = $query->getParams();并且 where 子句参数将在其中,$params['where']因此您可以从那里删除它们然后调用$query->setParams($params);

于 2010-02-20T00:35:12.060 回答
8

基于约书亚科迪的回答

    $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'));
于 2015-07-19T01:20:04.337 回答