如何访问实体(例如节点)对象的字段值?


63

node_load((int) $nid)加载一个完全填充的节点实体。$node->title->value获得标题,但是如何在Drupal 8中访问字段值?

Answers:


89

我猜您不需要转换$entity为数组,这将简单地工作。

$entity->get('field_name')->getValue();

仅供参考:kint()devel_kint模块中使用将使您知道所有可用于访问对象元素的可用方法,因此相对而言,var_dump()它的帮助较小。


14
实际上应该是:$ entity-> get('field_name')-> value;
Ed Hollinghurst'3

1
您知道为什么这是@EdHollinghurst吗?getValue确实对我来说是错误的,但是(使用dpm)它在可用方法中列出,而'value'则没有。
autopoietic

2
getValue()适用于我(在8.1.x和8.2.x上均适用)请参阅api参考
leon.nk,2016年

16
->getValue()是通用的,无论字段类型如何都可以使用。如果使用->value,则仅当字段值存储在value属性中时才起作用。它不适用于更复杂的类型(例如日期或实体参考)。
皮埃尔·布伊

4
如果实体没有名为“ field_name”的字段,则仅此代码将引发错误。确保仅在您知道该字段存在的实体上运行此代码,可以使用$ entity-> hasField('field_name')进行测试,或者使用(!empty($
entity-

56

在drupal 8中,$ node是类node

 $node->field_machine_name->getValue();

要么

$node->get('field_machine_name')->getValue();

将返回一个值数组。

如果只期望一个,则最好用

$node->field_machine_name->getString();

要么

 $node->get('field_machine_name')->getString();

我不“得到”(字符串和值)“它”。您能否添加更多详细信息以解释此答案?仅供参考:如果不这样做,您的答案就有可能因节制而被删除(对不起...)
Pierre.Vriens

34

对于字段,您应该可以使用$node->body->value例如。如果您不知道字段名称是什么,我建议为Drupal 8 安装Devel模块,并通过like检查节点dsm($node)


1
那你怎么渲染那个字段呢?
亚历克斯

1
这似乎已经过时了
Alex

1
@Alex我建议您对遇到的问题提出一个新问题。当时这是一个好的答案,现在编辑答案似乎很麻烦,因为此页面上的答案比该答案要多。
Tenken

5
检查本文以获得很好的解释。您可以使用$ node-> field_name-> value获取单个值(或多值字段的第一个键)。或者,您可以使用$ node-> field_name-> getValue()来获取字段的所有值作为数组。
Mirsoft '16

2
@tenken:实际上,更新现有答案比添加带有新答案的冗余问题更好。
皮埃尔·布伊

17

您始终$entity->toArray()可以查看实体中的内容。即使使用xdebug(例如,使用phpstorm),也很难使一个实体对象有意义。我怀疑dsm($node)在Drupal 8中是否有意义。如果您坚持要在浏览器中进行调试(但您不应该这样做,那么Drupal 8太复杂了,如果不使用xdebug进行调试)dsm($node->toArray())就是您想要的。


$节点- >指定者()不会对我的Drupal的8工作
阿克塞尔Briche

请添加一个新问题,详细说明。Drupal\Core\Entity\EntityInterfacetoArray

1
这个答案没有提供解决方案。投票。
科兰

虽然此答案不一定是对这个问题的直接答案,但它是该死的伟大功能。谢谢。
Stef Van Looveren

14

使用以下代码片段获取节点字段值

这用于从URL获取节点ID

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

使用nid加载节点数据

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

这用于获取字段值。

$terms = $node->get('field_Name')->getValue();  

这用于获取节点标题。

$product_name = $node->getTitle();

2
像这样加载节点:$ nid = \ Drupal :: routeMatch()-> getRawParameter('node'); $ node = \ Drupal :: entityTypeManager()-> getStorage('node')-> load($ nid);
2016年

8

对我来说,有一个$entity(节点)可以正常工作:

$entity->field_name->getValue();

使用8.1。


2
这将多值字段的所有值都放入一个数组中。当然,它也可以用于获取单值字段的值,但是输出将包含具有单个值的数组。为了得到一个字段的一个值(或一多值字段的第一个值),使用$实体- > field_name->值
Mirsoft

7

使用时(实际正确方法):

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();


4

很简单:

$node->get('field_name')->getValue()

如果该字段是实体引用字段,则有一些特殊的方法来获取引用的实体。

要获取目标ID(第一个元素):

$entity->get('field_entity_reference')->target_id

要获取已加载的实体(第一个元素):

$entity->get('field_entity_reference')->entity

->entity现场使用时,它将自动加载实体。

如果该字段可以包含多个引用,则可以这样获取它们:

$entities = $entity->get('field_entity_reference')->referencedEntities();

这将为您提供一系列实体。

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.