EntityFieldQuery内部联接


21

我想使用EntityFieldQuery对象运行查询。我需要来自node和node_access表的值,因此我需要使用INNER JOIN。从do文档中,我无法弄清楚这是怎么可能的。

这就是我所拥有的-

$query = new EntityFieldQuery();
$result = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'node_access')
->propertyCondition('type', 'external_link')
->propertyCondition('status', 1)
->fieldCondition('gid', '3', '=')
->fieldCondition('realm', 'domain_id', '=')
->fieldCondition('grant_view', '1', '>=')
->range(0,1)
->execute();

1
尽管它无法在Drupal 7中即时完成,但可以在Drupal 8中完成(在撰写本文时尚未发布)。有关详细信息,请参见实体字段查询获得联接支持(包括示例)。
科兰

在Drupal 8中,所有条件都是这样(-> condition())。D8中的EFQ的示例:$ result = \ Drupal :: entityQuery('node')-> condition('type',array('entity_a','entity_b'),'IN')-> condition('status' ,NODE_PUBLISHED)-> condition('field_myfield.value','5','=')-> execute(); 在Drupal 8 EFQ中,列是在drupal 7中的field_name.value或field_name.target_id直接在名称字段中定义的->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

Answers:


30

您不能EntityFieldQuery直接添加额外的联接(不支持),但是可以将标签添加到查询中,实现hook_query_TAG_alter(),并在将查询转换为标准db查询时手动添加联接。

这未经测试,但可能会带给您大部分帮助:

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'node_access')
  // etc
  ->addTag('MYTAG');

// get the query results as normal

然后查询alter函数:

function MYDMOULE_query_MYTAG_alter(QueryAlterableInterface $query) {
  $query->join('node_access', 'node_access', 'node_access.nid = node.nid');
}

另一种方法是继承EntityFieldQuery自身并添加连接,但是在这种情况下,我认为上述方法更简单。


是否有更好的方法在单个函数中执行此操作?即使它不是EntityFieldQuery
艾伦·托马斯

2
并非如此,唯一的另一种方法是使用手动构建查询db_select,然后您可以根据需要对其进行控制
Clive

我会去的。Thx
艾伦·托马斯

@Clive ...哦,这个答案真的很有趣。喜欢它。:P
tenken 2012年

2
@Michiel No EntityFieldQuery不执行任何缓存,它只包装a SelectQuery并为实体添加一些方法。那些额外的方法会导致您使用它的性能略有下降(非常轻微),而不是常规的SelectQuery
Clive

3

如果您将自定义属性与自己的表一起使用,则tag方法将不起作用。您需要改用子查询:

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'user');

$roles_subquery = db_select('users_roles', 'ur');
$roles_subquery->fields('ur', array('uid'));
$roles_subquery->condition('rid', $my_role_id);

$query->propertyCondition('uid', $roles_subquery, 'IN');

请参阅在EntityFieldQuery中需要连接,子查询如何?有关详细信息。


具有自定义表格的解决方案,适用于我的情况。很棒的工作!
伊格纳西奥(Ignacio Segura)Postigo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.