示例:我想获取节点5的field_tags内的所有标签名。
我可以通过$ node-> field_tags-> getValue()获得target_id ;
但是问题是,我不知道target_id值属于哪个实体。可以是节点ID,术语ID,用户ID。没有该信息,我将无法使用target_id来获取标签的名称。
如何获得实体引用字段的所有名称?
示例:我想获取节点5的field_tags内的所有标签名。
我可以通过$ node-> field_tags-> getValue()获得target_id ;
但是问题是,我不知道target_id值属于哪个实体。可以是节点ID,术语ID,用户ID。没有该信息,我将无法使用target_id来获取标签的名称。
如何获得实体引用字段的所有名称?
Answers:
得到您想要的东西的最简单的方法是这样的:
$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模块或使用调试器,但这将为您提供实体的内部结构,而这并不是您真正想看到的。
print_r($entity->toArray())
它解决了这个问题。我可以获取所有字段的详细信息。非常感谢。
根据定义,实体引用字段只能定位一种实体类型,因此您可以通过调用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();
Or better yet
方法来获得价值。第一种方法很好,但是它将需要if语句检查目标类型,然后获取值。由于不需要检查,因此Berdir的答案更加有效。
target_type
从一个entity_reference
字段中获取价值,并在其中上下搜索……直到您在这里回答了我的问题。
$node->toArray();
当然看起来比使用更短,更干净\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');