web-dev-qa-db-ja.com

「OR」を使用するようにビュークエリを変更するにはどうすればよいですか?

以下は、ビューに渡される_$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()でクエリを使用するにはどうすればよいですか?

4
enjoylife

これはテストされていませんが、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」に設定することで、質問で概説する方法で機能するはずです。

3
jhedstrom

私はあなたが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を使用するための正確なケースを見つける必要があるかもしれません

2
Rohith Pv

これは古いことに気づきましたが、必要な人なら誰でも答えたいと思いました。

ビュー7.x-3.x。 UIを介してこれを行います。フィルターを追加するだけで、フィルターUIを介してフィルターを注文し、ANDまたはOR関係で配置できるフィルターのグループを追加できます。

この場合、最初のグループとのAND関係に2番目のグループを追加しますが、グループのコンテンツとOR関係を持ちます。 OR node.sticky <> 0。

0
Andrew Wasson