以编程方式获取实体引用字段的所有名称


10

示例:我想获取节点5的field_tags内的所有标签名

我可以通过$ node-> field_tags-> getValue()获得target_id ;

在此处输入图片说明

但是问题是,我不知道target_id值属于哪个实体。可以是节点ID,术语ID,用户ID。没有该信息,我将无法使用target_id来获取标签的名称。

如何获得实体引用字段的所有名称?

Answers:


20

得到您想要的东西的最简单的方法是这样的:

$names = [];
foreach ($node->field_tags as $item) {
  if ($item->entity) {
    $names[$item->entity->id()] = $item->entity->label();
  }
}

->entity是所谓的计算属性,它不会显示在中getValues()。所有参考字段都有它。

是的,忘记print_r()实体或其他复杂对象。它们包含互相引用的对象,print_r()无法处理。如果您有实体,请始终使用print_r($entity->toArray()),则仅获取字段值。您可以安装devel模块或使用调试器,但这将为您提供实体的内部结构,而这并不是您真正想看到的。


2
$node->toArray();当然看起来比使用更短,更干净\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
No Sssweat

在哪里可以找到有关文档?
AlxVallejo

您可以在此处找到一些信息,例如:drupal.org/docs/8/api/entity-api
Berdir

@Berdir:print_r($entity->toArray())它解决了这个问题。我可以获取所有字段的详细信息。非常感谢。
kalidasan

@Berdir您可以更详细地说明文档吗?我一直在浏览该页面,但是没有看到与术语参考字段相关的任何特定示例。
凯文

6

根据定义,实体引用字段只能定位一种实体类型,因此您可以通过调用getSetting()字段定义来知道目标类型是什么。

// Print the targeted entity type field.
$field = \Drupal\field\Entity\FieldStorageConfig::loadByName('node','field_tags');
echo $field->getSetting('target_type');

或者更好的是,使用它EntityReferenceFieldItemList::referencedEntities()来拉取节点的引用实体和所需的关联数据。

// Return an array of Entity objects referenced in the field.
$node->field_tags->referencedEntities();

print_r($node->field_tag->referencedEntities());似乎是资源浪费,因为我一直在获取WSOD,所以我已经升级了我的AWS实例,只是为了能够做到。
没有Sssweat

让我知道这是否应该是一个单独的问题。我如何访问名称值,当它在数组中显示values:protected时,意味着它只能在类内部访问。
没有Sssweat

对于拒绝您的回答,我感到很难过,但是@Berdir的回答让我别无选择。我从来没有想过如何使用您的Or better yet方法来获得价值。第一种方法很好,但是它将需要if语句检查目标类型,然后获取值。由于不需要检查,因此Berdir的答案更加有效。
没有Sssweat

1
不要流汗(...双关语意)。您的问题的第一个版本对您的目标不太清楚。您应该标记最合适的答案。
肖恩·康

我真的希望这个答案不会被埋在这个SO帖子中。我想target_type从一个entity_reference字段中获取价值,并在其中上下搜索……直到您在这里回答了我的问题。
Keven
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.