特定の分類法(ページ)のすべての用語を表示するビューがあります。私の用語は包含ノードと関係があります。私のノードは分類用語でグループ化されています。
私は日付フィルターなしでこの結果を取得します:
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を作成する方法を誰かが説明できれば、とても助かります。 :)
SQLを見ると、サブクエリから_LEFT JOIN
_を構築しようとしているようです。これは、ビューの内部に入る必要があるケースの1つです。
あなたがここで見ているいくつかのコンポーネントがあります:
db_select()
サブクエリを作成します。views_join()
を使用して、ビューへの結合を構築します。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');
}
_