web-dev-qa-db-ja.com

hook_views_query_alter()を使用してSQLクエリを追加するにはどうすればよいですか?

次のSQLクエリがあります。

_db_query("SELECT content_id, COUNT(*) as count FROM {votingapi_vote}
          WHERE value_type = '%s'  AND value = 1
          GROUP BY content_id;", "option");
_

ビューをオーバーライドしたい場合、どのコードをmymodule_views_query_alter()に配置する必要がありますか?

_$query_の内容は次のとおりです。

 views_query Object(
 [table_queue] => Array(
 [node] => Array(
 [alias] => node 
 [table ] => node 
 [relationship] => node 
 [join] => 
)
)
 [tables] => Array(
 [node] => Array(
 [node] => Array(
 [count] => 1 
 [alias] => node 
 )
)
)
 [関係] =>配列(
 [ノード] =>配列(
 [リンク] => 
 [テーブル] =>ノード
 [エイリアス] =>ノード
 [ベース] =>ノード
)
)
 [場所] => Array(
 [0] => Array(
 [clauses] => Array(
 [0] => node.status 0 
 [1] => node.type in( '%s')
)
 [args] => Array(
 [0] =>プロバイダー
 )
 [type] => AND 
)
)
 [having] => Array()
 [group_operator] => AND 
 [orderby] => Array(
 [0] => node_created DESC 
)
 [groupby] => Array()
 [header] = > Array()
 [distinct] => 
 [base_table] => node 
 [base_field] => nid 
 [fields] => Array(
 [nid] => Array(
 [table] => node 
 [field] => nid 
 [alias] => nid 
)
 [node_title] => Array(
 [field] => title 
 [table] => node 
 [alias] => node_title 
) 
 [node_created] => Array(
 [field] => created 
 [table] => node 
 [alias] => node_created 
 )
 [content_id_] => Array(
 [field] => 
 [table] => content_id [._ ___。] [エイリアス] => content_id _ 
)
)
 [count_field] => Array(
 [table] => node 
 [フィールド] => nid 
 [エイリアス] => nid 
 [カウント] => 1 
)
)
1
enjoylife

hook_query_views_alterの使用は、予期しないときに簡単に戻って噛み付く可能性があるため、注意して行う必要があります。私を信用して、私はいくつかの機会にこれを試しました。

hook_query_views_alterは、任意のクエリを作成できるので強力ですが、名前が示すように、変更として使用する必要があります。任意のクエリでビューを作成し、alterフックで実際のクエリを最初から完全に作成するためのものではありません。これは、など、多くの混乱を招く可能性があります。なぜ、ビューは私が設定したものとは異なるものを表示し、なぜ変更しても変更されないのですか

ビューからのクエリは次のようになります。

SELECT nid, title, created FROM {node}
WHERE type IN ('provider') AND status = 0

に比べ

 SELECT content_id, COUNT(*) as count FROM {votingapi_vote}
 WHERE value_type = '%s'  AND value = 1
 GROUP BY content_id;

問題を解決するには2つの方法があり、hook_views_query_alter関数の厄介なハックにソートする必要がありません。これは、維持が難しく、おそらく開発者や次の開発者の問題を先に解決するでしょう。

  1. ノードテーブルを使用してJOINを作成します

    投票APIにはビューの統合がありますが、ベーステーブルとして使用して、ビューでテーブルをクエリすることはサポートしていません。ただし、結合(関係)の作成はサポートされています。ほとんどの場合、ノードに投票しています。その場合は、ノードからベースビューを作成し、投票を関係として追加できます。関係と必要なフィールドを追加する方法については、以下のSSを参照してください。

    SS http://tardis1.tinygrab.com/grabs/99f4a5fef7b5f963fa6a64f0be8ad451af21915caf.jpg

  2. 投票テーブルに関するビューに情報を追加します

    hook_views_data_alterを使用すると、投票テーブルに関する必要な情報を追加して、直接クエリを実行できます。ビューのドキュメントには、これがどのように行われるかについての優れた例があります。次に、投票をクエリするビューを作成し、ビューインターフェイスを介して、投稿したものと同様のクエリを作成できます。

2
googletorp

これを試してみてください googletorp としてビューで最初に移動します。それはまたあなたを助けます

   function custom_views_query_alter(&$view, &$query){

    if($view -> name == "SomeView"){

      $sample_query = db_query("SELECT content_id FROM {votingapi_vote}
          WHERE value_type = '%s'  AND value = 1
          GROUP BY content_id;", "option")->fetchField();

      array_Push($query->where[2]['conditions'],array('field'=>"node.nid","value"=>array_unique($sample_query),"operator"=>"IN"));

    }

   }
0
user46183