首先让我从结构开始:
[main_node]
- > field_reference_to_sub_node->的[sub_node]
- > field_ref_to_sub_sub_node->的[sub_sub_node]
< /强>
[sub_sub_node]
- &gt; field_type = ['wrong_type', 'right_type']
如何有效查询[sub_sub_node]
所有right_type
ID,由main_node
引用(当前打开的节点)?
在foreach
上执行node_load似乎有点过分。有人有更好的解决方案吗?非常感谢!
答案 0 :(得分:2)
如果要直接查询字段表:
$query = db_select('node', 'n')->fields('n_sub_subnode', array('nid'));
$query->innerJoin('table_for_field_reference_to_sub_node', 'subnode', "n.nid = subnode.entity_id AND subnode.entity_type='node'");
$query->innerJoin('node', 'n_subnode', 'subnode.subnode_target_id = n_subnode.nid');
$query->innerJoin('table_for_field_ref_to_sub_sub_node', 'sub_subnode', "n_subnode.nid = sub_subnode.entity_id AND sub_subnode.entity_type='node'");
$query->innerJoin('node', 'n_sub_subnode', 'sub_subnode.sub_subnode_target_id = n_sub_subnode.nid');
$query->innerJoin('table_for_field_type', 'field_type', "n_sub_subnode.nid = field_type.entity_id AND field_type.entity_type='node'");
$query->condition('n.nid', 'your_main_node_nid');
$query->condition('field_type.field_type_value', 'right_type');
以下是每行的解释:
$query = db_select('node', 'n')->fields('n_sub_subnode', array('nid'));
我们首先使用别名“n”查询基节点表。这是用于'main_node'的表。但是,将返回的节点ID将来自另一个别名(n_sub_subnode),您将在下面看到它。
$query->innerJoin('table_for_field_reference_to_sub_node', 'subnode', "n.nid = subnode.entity_id AND subnode.entity_type='node'");
第一个连接是使用field_reference_to_sub_node字段的表,因此您必须将其替换为表的实际名称。这就是我们如何获得对子节点的引用。
$query->innerJoin('node', 'n_subnode', 'subnode.subnode_target_id = n_subnode.nid');
连接到子节点的节点表。您必须使用field_reference_to_sub_node表中的'subnode_target_id'替换目标ID的实际字段。此连接的主要目的是确保子节点字段中存在有效节点。
$query->innerJoin('table_for_field_ref_to_sub_sub_node', 'sub_subnode', "n_subnode.nid = sub_subnode.entity_id AND sub_subnode.entity_type='node'");
包含对sub_sub_node的引用的表的连接,因此您必须将“table_for_field_ref_to_sub_sub_node”替换为表的实际名称。这就是我们如何获得对sub_sub_nodes的引用。
$query->innerJoin('node', 'n_sub_subnode', 'sub_subnode.sub_subnode_target_id = n_sub_subnode.nid');
连接到sub_sub_nodes的节点表,以确保我们有有效的引用。您必须将'sub_subnode_target_id'替换为'field_ref_to_sub_sub_node'表中目标ID的实际字段。
$query->innerJoin('table_for_field_type', 'field_type', "n_sub_subnode.nid = field_type.entity_id AND field_type.entity_type='node'");
现在我们终于可以使用field_type信息加入表了。您必须将'table_for_field_type'替换为表的实际名称。
$query->condition('n.nid', 'your_main_node_nid');
如果需要,您现在可以为主节点ID添加条件。
$query->condition('field_type.field_type_value', 'right_type');
字段类型的条件。您必须将'field_type_value'替换为值的表字段的实际名称。
当然,如果您确实始终拥有有效的引用,则可以跳过连接到节点表,并使用target id和entity_id字段直接连接字段表(基本上字段表中的target_id已经有成为下一个的entity_id。)
我真的希望我没有拼写错误,所以请仔细检查查询。