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フレームワークのために私はdoctrine1.0.xで立ち往生しています。

4

2 に答える 2

8

を呼び出すと、、、などの関数を介して追加されたwhere句の一部$query->getDqlPart('where')が返されます。したがって、これを使用して、必要なパーツを見つけて削除できます。arraywhere()andWhere()

次に、パラメータを処理する必要があります。どこの部分をサイクリングしている間、あなたはすべてを見つける必要がありますか?それらを数え、削除してから呼び出す番号を覚えておいてください。where$params = $query->getParams();句のパラメータが含まれる$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 に答える