仅使用EntityFieldQuery获得一些字段?


19

Drupal 7通过EntityFieldQuery具有非常有希望的类似于ORM的查询系统。

目前,我了解如何选择节点,但是结果不包含我要查找的任何特定信息,例如文件字段。

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

因此,如果我们只想获取一个字段的值,例如当前示例中的“ field_date”,则需要加载节点的全部数据。

$nodes = entity_load('node', array_keys($entities['node']));

如果有一种获取字段值的方法,而是加载所有节点的完整数据,因为这会引起一些内存过载。

$nodesFieldDates = ???

Answers:


10

好问题!

EntityFieldQuery 是真正的好东西,但是如果您真的想变得认真一点,则必须重写自定义模块中的类,并在其中添加您需要执行的任何操作。

我不知道您的确切意图,但过去我曾将自己引荐给这篇文章。归功于尼尔·黑斯廷斯(Neil Hastings)的出色写作。

在文章中查找一些代码示例,以获取有关覆盖的漂亮示例。

希望对您有所帮助,编码愉快!


好的我明白了 !因此,可能可以重新定义“ EntityFieldQuery”“ buildQuery”方法,以替换结果字段。可能这可行。
Fedir RYKHTIK 2011年

11

我找到了答案!为了实现它,Apache Solr模块扩展了EntityFieldQuery类。它添加了一个名为addExtraField的新方法。

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

如果您没有安装Apache Solr,则只需复制用于扩展该类的代码。


为此创建了一个沙箱,因为Apache Solr模块具有一些缺点drupal.org/sandbox/mikeytown2/2209909
mikeytown2 2014年

2
仅针对mikeytown2创建的(当前沙箱)模块(感谢!)支持此答案
Oliver Coleman

答案中的链接似乎无效。它说:“您需要先登录或注册,然后再继续。”
mbomb007



0

仍然想从EFQ中获取字段的任何人都可以查看EFQ额外字段模块。

警告:此模块滥用EntityFieldQuery从数据库返回数据。它不适用于实体或基于它们的任何模块。

它允许您在EntityFieldQueryExtraFields对象(扩展EntityFieldQuery对象)中使用addField。最初,EntityFieldQuery仅向您提供实体ID,捆绑和实体类型。此模块在此之上添加了一个额外的层,而无需执行额外的entity_loads!如果要使用大量数据并且要减少sql查询,则很重要。由于EFQ已经在数据库中查询了此信息,所以为什么不更改该查询以也为您提供一些其他字段。这意味着将不会执行单个额外的查询来获取该数据。

提醒一下,如果您依赖于Entity_load或类似函数中发生的某些后期格式化/后期加载,则此模块将不会处理。您必须确保自己检索到的数据的有效性。

例

获取节点标题

$ query = new EntityFieldQueryExtraFields();
  $ result = $ query-> entityCondition('entity_type','node')
  -> propertyCondition('type','my_bundle_type')
  -> propertyCondition('状态',1)
  -> addExtraField('field_myfield',value',value')
  -> addExtraField('field_mynodereffield',nid',nid')
  -> addExtraField('','title','title','node')
  -> fieldCondition('field_myfield','value','some_value_to_filter_on','=')
  ->执行();
可能的组合:
addExtraField($ field_name,$ column,$ column_alias = NULL,$ table = NULL)

field_name
指定额外的字段应来自哪个字段。如果来自基本表,则将其保留为空并填写表参数

柱
指定列的名称,

column_alias
指定列的别名,

表
(可选)在此处(基表)添加诸如node或user之类的内容,

我已经尝试了mikeytown2的这个模块(EFQ Extra Fields)和(当前的沙箱)模块,后者似乎要好得多(使用更方便,输出更合理),并且看上去也要比前者更好。mikeytown2沙箱模块位于drupal.org/sandbox/mikeytown2/2209909中
奥利弗·科尔曼
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.