web-dev-qa-db-ja.com

hook_query_alter()の構造化クエリオブジェクトから「where」句を削除するにはどうすればよいですか?

この質問 から飛び降りて、hook_views_query_alter()ではなく、プレーンな古いhook_query_alter()でクエリオブジェクトのWHERE句の各スニペットを適切に検出して削除する方法を知りたい(ビューとしてクエリオブジェクトは完全に異なる方法で構造化されているように見えます(イライラします!) documentation は、次のように操作することで操作できるクエリ条件への参照を作成する方法を示すことで、これが可能であることを漠然と示唆していますこの:

$where =& $query->conditions();

...しかし、その中のオブジェクトは完全に混乱しており、私は既存のスニペットを削除または置き換えるのに苦労しています。私は/includes/select.incと/includes/query.incを調べましたが、その中のクラスは操作を微調整するためのメソッドを提供していないようです。

5
Adam Friedman

それだけです。hook_query_alter()では、「外部」からのみクエリオブジェクトにアクセスできます。条件を削除するためのパブリックAPIがないため、やや混乱しています。

ただし、巧妙なphpハッカーが続いているため、$where =& $query->conditions();またはドキュメントにリンクした他の例を呼び出すと、対応する変数への参照が返されます。

したがって、上記のwhereの例では、_$query->where_保護クラス変数にアクセスできます。それらを検査すると、それらはすべての情報を含む基本的なphp配列であることがわかり、文字通りその参照の設定を解除して実行することができます。

そう:

$where =& $query->conditions(); // Remove the second condition. unset($where[1]);

最後に、具体的にwhereクエリでは、_#conjunction_および最終的にはより複雑なものやグループ化のものに注意する必要があります。

8
Alex Weber