教義:リスナーの内部選択クエリからwhere句(preDqlSelect)の一部を削除する方法?
質問
私のリスナーが呼び出されたselectクエリのwhere句内のすべてのis_publishedのチェックを外す必要がある行動の一部です。句の一部を追加することは非常に簡単ですが、どのように1を削除します。
Doctrine_Query->removeDqlQueryPart('where')
のようないくつかの機能がありますが、
私は削除する'is_published = ?'
部品を必要としながら、それは、完全な句を削除します。
しかし、私は正規表現か何かで、手動で何とかこれを扱うことができます。しかし、トリッキーな部分は、によって表されるパラメータ削除する方法、です「か」対応するパラメータからアレイ(Doctrine_Query->getRawParams()
によって検索可能)。
私が尋ねるので、クエリのこの種を変換するためのクリーンな方法がある:
...FROM Video v WHERE v.is_published = ? AND v.start_date < ? AND v.end_date > ?
この1つを剥奪し、めちゃくちゃにすることなく、paramsがクエスチョンマークで表されます。
...FROM Video v WHERE v.start_date < ? AND v.end_date > ?
このはもちろん単純な例であり、私のクエリは、もう少し複雑です。 残念ながら、私はので、symfonyフレームワークの教義の1.0.xので立ち往生しています。
解決
$query->getDqlPart('where')
を呼び出す場合array
を介して、それらを添加したとして句、where()
などの機能部品のandWhere()
を返します。だから、あなたがしたい部分を見つけて削除するためにそれを使用することができます。
その後、あなたはのparamsに対処する必要があります。どこの部分を巡回しながら、あなたはすべてを見つける必要があるでしょうか?そして、あなたが削除して$params = $query->getParams();
を呼び出し、あなたがそこからそれらを削除してから、$params['where']
$query->setParams($params);
になりますどこにそれらをカウントし、もののいずれかの番号を覚えています 他のヒント
ベースジョシュア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'));