我听者是一个行为,即应该删除任何被称为选择查询的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 > ?

此汽提一个与不搞乱由问号表示的PARAMS:结果 ...FROM Video v WHERE v.start_date < ? AND v.end_date > ?

这是当然只是一个简单的例子,我的查询更复杂一点。 不幸的是,我坚持了原则1.0.x的,因为symfony的框架。

有帮助吗?

解决方案

调用$query->getDqlPart('where')将返回where子句的部分的array因为他们经由where()andWhere()等功能加入。所以,你可以用它来查找并删除你想要的部分。

然后,你必须要处理的PARAMS。虽然骑自行车经过这里的部分,你需要找到所有?和计数并记住这些数字对于任何您删除的人,然后打电话$params = $query->getParams();和where子句参数将在$params['where']这样你就可以从那里删除它们,然后调用$query->setParams($params);

其他提示

根据约书亚科迪回答

    $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'));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top