Программно получить все имена поля ссылки на сущность

10

Пример: я хочу получить все имена тегов, которые находятся внутри field_tags узла 5.

Я могу получить target_id с помощью $ node-> field_tags-> getValue () ;

введите описание изображения здесь

Но проблема в том, что я не знаю, к какому объекту относится значение target_id. Может быть идентификатором узла, термином id, идентификатором пользователя. Без этой информации я не могу использовать target_id для получения имени тега.

Как я могу получить все имена поля ссылки на сущность?

Нет Sssweat
источник

Ответы:

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 или использовать отладчик, но это даст вам внутреннюю структуру сущности, которую вы не хотите видеть.

Berdir
источник
2
$node->toArray();конечно, выглядит намного короче и чище, чем при использовании\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
нет Sssweat
Где вы найдете документацию по этому вопросу?
AlxVallejo
Вы можете найти некоторую информацию здесь, например: drupal.org/docs/8/api/entity-api
Berdir
@Berdir: print_r($entity->toArray())это решает эту проблему. Я могу получить все детали полей. Огромное спасибо.
Калидасан
@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());Похоже, это проблема с ресурсами, я обновил свой экземпляр AWS , просто чтобы иметь возможность сделать это, так как я продолжал получать WSOD.
Нет Sssweat
Дайте мне знать, если это будет отдельный вопрос. Как я могу получить доступ к значению имени, когда в массиве написано values: protected, что означает, что к нему можно получить доступ только внутри класса.
Нет Sssweat
Мне жаль, что я не принял твой ответ, но ответ @Berdir не оставил мне другого выбора, кроме как. Я никогда не понимал, как получить значение, используя ваш Or better yetметод. Первый метод хорош, но он требует, чтобы операторы проверяли тип цели и затем получали значение. Ответ Бердира более эффективен, поскольку нет необходимости в проверках.
Нет Sssweat
1
Не переживайте (... каламбур). Первая версия вашего вопроса была не слишком ясна для вашей цели. Вы должны отметить ответ, который подходит лучше всего.
Шон Конн
Я действительно хотел бы, чтобы этот ответ не был похоронен в этом посте. Я хотел получить target_typeзначение из entity_referenceполя и искал высоко и низко его ... пока вы не ответили на мой вопрос здесь.
Кевен