vir*_*ize 6 php doctrine behavior listener
我的侦听器是行为的一部分,应该删除任何被调用的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 > ?
对于这个剥离的,没有弄乱问号代表的params:
...FROM Video v WHERE v.start_date < ? AND v.end_date > ?
这当然只是一个简单的例子,我的查询有点复杂.不幸的是,由于symfony框架,我坚持使用doctrine 1.0.x.
调用$query->getDqlPart('where')将返回一个arraywhere子句的部分,因为他们通过附加的where(),andWhere()等功能.因此,您可以使用它来查找和删除所需的部分.
然后你必须处理params.骑自行车穿过你需要找到的所有部位?并计算它们并记住你删除的任何一个的数字,然后调用$params = $query->getParams();和where子句参数将在,$params['where']所以你可以从那里删除它们然后调用$query->setParams($params);
基于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'));
Run Code Online (Sandbox Code Playgroud)