以下は、ビューに渡される_$query
_オブジェクトの内容です。
[where] => Array( [0] => Array( [clauses] => Array( [0] => node.type in ( '%s') [1] => node.status 0 [2] => node.promote 0 [3] => node.sticky 0 ) [args] => Array( [0] => test ) [type] => AND ) ) [having] => Array() [group_operator] => AND
hook_views_query_alter()
を使用してオーバーライドしたい。デフォルトの演算子はすべてANDですが、次のクエリを取得します
[0] => node.type in( '%s')AND [1] => node.status 0 AND [2] => node.promote 0 OR [3] => node.sticky 0
最後の演算子で「OR」を使用するにはどうすればよいですか?
_db_query("SELECT content_id, count(*) AS cnt FROM {votingapi_vote} WHERE value =1 AND value_type = '%s'" , "option");
_
Hook_views_query_alter()でクエリを使用するにはどうすればよいですか?
これはテストされていませんが、alter関数内で実行したいことは次のとおりです。
function mymodule_views_query_alter(&$query) {
unset($query->where[0]['clauses'][2]);
unset($query->where[0]['clauses'][3]);
$query->where[1] = array(
'clauses' => array(
0 => 'node.promote <> 0',
1 => 'node.sticky <> 0',
),
'type' => 'OR',
);
}
これは基本的に、プロモートおよびスティッキー句を新しいwhereグループに移動し、タイプを「OR」に設定することで、質問で概説する方法で機能するはずです。
私はあなたがdb_orを使うことができると思います、例えばあなたが新しいwhere句を作成しているなら、あなたはこのようなものを使うことができます
function mymodule_views_query_alter(&$query) {
if ('name' == $view->name && 'page' == $view->current_display) {
$or = db_or()
->condition('table.column', $value, 'NOT IN')
->condition('table.column', $value, 'NOT IN');
$query->add_where(1,$or);
}
}
あなたの問題では、foreachを使用し、db_orを使用するための正確なケースを見つける必要があるかもしれません
これは古いことに気づきましたが、必要な人なら誰でも答えたいと思いました。
ビュー7.x-3.x。 UIを介してこれを行います。フィルターを追加するだけで、フィルターUIを介してフィルターを注文し、ANDまたはOR関係で配置できるフィルターのグループを追加できます。
この場合、最初のグループとのAND関係に2番目のグループを追加しますが、グループのコンテンツとOR関係を持ちます。 OR node.sticky <> 0。