web-dev-qa-db-ja.com

ビュー:ノードを含む、または含まない分類法のすべての用語を表示します

特定の分類法(ページ)のすべての用語を表示するビューがあります。私の用語は包含ノードと関係があります。私のノードは分類用語でグループ化されています。

私は日付フィルターなしでこの結果を取得します:

taxonomy term 1
    - node 1 (2016-06)
    - node 2 (2016-07)

taxonomy term 2
    - node 3 (2016-06)

taxonomy term 3

taxonomy term 4

taxonomy term 5

taxonomy term 6
    - node 4 (2016-06)

問題

異なる月のノードを取得するために公開された日付フィルターがあります。しかし、このフィルター(2016-06)を使用すると、一致するノードがない用語が結果に表示されません。

taxonomy term 1
    - node 1 (2016-06)

taxonomy term 2
    - node 3 (2016-06)

taxonomy term 6
    - node 4 (2016-06)

これは、日付フィルター(2016-06)を使用したときに探している結果です。

taxonomy term 1
    - node 1 (2016-06)

taxonomy term 2
    - node 3 (2016-06)

taxonomy term 3

taxonomy term 4

taxonomy term 5

taxonomy term 6
    - node 4 (2016-06)

だから私の質問は:

フィルターがアクティブな場合、ノードを含むまたは含まないビューですべての分類用語を表示するにはどうすればよいですか?


[〜#〜]更新[〜#〜]

これは、公開されたフィルターがアクティブなときにビューから生成されたSQLです。 2番目のwhere条件は私の条件を削除します。

SELECT DISTINCT 
    node_taxonomy_index.nid AS node_taxonomy_index_nid, 
    taxonomy_term_data.name AS taxonomy_term_data_name, 
    taxonomy_term_data.vid AS taxonomy_term_data_vid, 
    taxonomy_term_data.tid AS tid, 
    taxonomy_vocabulary.machine_name AS taxonomy_vocabulary_machine_name, 
    'node' AS field_data_field_position_node_entity_type, 
    'node' AS field_data_field_seite_node_entity_type, 
    'node' AS field_data_field_sebepla_status_node_entity_type, 
    'node' AS field_data_field_typ_node_entity_type, 
    'node' AS field_data_field_ausgabenzeitraum_node_entity_type
FROM 
    {taxonomy_term_data} taxonomy_term_data
LEFT JOIN {taxonomy_index} taxonomy_index 
    ON taxonomy_term_data.tid = taxonomy_index.tid
LEFT JOIN {node} node_taxonomy_index 
    ON taxonomy_index.nid = node_taxonomy_index.nid
LEFT JOIN {taxonomy_vocabulary} taxonomy_vocabulary 
    ON taxonomy_term_data.vid = taxonomy_vocabulary.vid
LEFT JOIN {field_data_field_ausgabenzeitraum} node_taxonomy_index__field_data_field_ausgabenzeitraum 
    ON node_taxonomy_index.nid = node_taxonomy_index__field_data_field_ausgabenzeitraum.entity_id AND 
        (node_taxonomy_index__field_data_field_ausgabenzeitraum.entity_type = 'node' AND 
        node_taxonomy_index__field_data_field_ausgabenzeitraum.deleted = '0')
WHERE 
    (( (taxonomy_vocabulary.machine_name IN  ('sebepla_seiten')) AND 
    (DATE_FORMAT(node_taxonomy_index__field_data_field_ausgabenzeitraum.field_ausgabenzeitraum_value, '%Y-%m') = '2016-06') ))

次のSQLを使用すると、正しい結果が得られます。

SELECT DISTINCT 
    node.nid AS node_taxonomy_index_nid, 
    taxonomy_term_data.name AS taxonomy_term_data_name, 
    taxonomy_term_data.vid AS taxonomy_term_data_vid,
    taxonomy_term_data.tid AS tid, 
    taxonomy_vocabulary.machine_name AS taxonomy_vocabulary_machine_name,
    'node' AS field_data_field_position_node_entity_type, 
    'node' AS field_data_field_seite_node_entity_type, 
    'node' AS field_data_field_sebepla_status_node_entity_type, 
    'node' AS field_data_field_typ_node_entity_type, 
    'node' AS field_data_field_ausgabenzeitraum_node_entity_type
FROM 
    taxonomy_term_data
LEFT JOIN taxonomy_index taxonomy_index 
    ON taxonomy_term_data.tid = taxonomy_index.tid
LEFT JOIN 
    ( 
        SELECT 
            node.nid
        FROM   
            field_data_field_ausgabenzeitraum node_taxonomy_index__field_data_field_ausgabenzeitraum, 
            node
        WHERE  
            node.nid = node_taxonomy_index__field_data_field_ausgabenzeitraum.entity_id AND 
            node_taxonomy_index__field_data_field_ausgabenzeitraum.entity_type = 'node' AND 
            node_taxonomy_index__field_data_field_ausgabenzeitraum.deleted = '0' AND 
            DATE_FORMAT(node_taxonomy_index__field_data_field_ausgabenzeitraum.field_ausgabenzeitraum_value, '%Y-%m') = '2016-06'
    ) node ON taxonomy_index.nid = node.nid
LEFT JOIN 
    taxonomy_vocabulary taxonomy_vocabulary 
        ON taxonomy_term_data.vid = taxonomy_vocabulary.vid
WHERE (( (taxonomy_vocabulary.machine_name IN  ('sebepla_seiten')) ))

今、私の新しい質問:

このクエリをビューに実装する方法は? hook_views_query_alterがキーであることは知っています。ビューオブジェクトクエリで使用した条件を使用して、左結合selectを作成する方法を誰かが説明できれば、とても助かります。 :)

2
Huelfe

SQLを見ると、サブクエリから_LEFT JOIN_を構築しようとしているようです。これは、ビューの内部に入る必要があるケースの1つです。

あなたがここで見ているいくつかのコンポーネントがあります:

  1. 参加する db_select() サブクエリを作成します。
  2. views_join() を使用して、ビューへの結合を構築します。
  3. views_plugin_query_default::add_table() を使用して、結合されたサブクエリテーブルをビューに挿入します。

不完全な例は次のようになります。

_function mymodule_views_query_alter(&$view, &$query) {
  //$query->addJoin(j)

  // Build subquery to match expression
  $sub_query = db_select('field_data_field_ausgabenzeitraum', 'node_taxonomy_index__field_data_field_ausgabenzeitraum');
  $sub_query->fields('n', array('nid'));

  // INNER JOIN is the same as "SELECT * FROM table1, table2"
  $sub_query->addJoin('INNER', 'node', 'n');
  $sub_query->conditions('n.nid', 'node_taxonomy_index__field_data_field_ausgabenzeitraum.entity_id');
  // @TODO: Add Remaining Conditions & utilize addExpression() for DATE_FORMAT()

  // Build subquery JOIN.
  $join = new views_join();
  $join->type = 'LEFT';
  $join->definition = array('table formula' => $sub_query);
  $join->left_table = 'taxonomy_index';
  $join->left_field = 'nid';
  $join->field = 'nid';

  // Add the joined subquery table
  $query->add_table('node', NULL, $join, 'node');
}
_
2
Shawn Conn