我的侦听器是行为的一部分,该行为应该删除任何调用的 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 原则。
基于约书亚·科迪的回答
$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'));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)