web-dev-qa-db-fra.com

Obtenir par programme tous les noms d'un champ de référence d'entité

Exemple: je veux obtenir tous les noms de balises qui sont à l'intérieur field_tags de nœud 5.

Je peux obtenir le target_id avec getValues ​​() ;

enter image description here

Mais le problème est que je ne sais pas à quelle entité appartient la valeur target_id. Peut être un identifiant de nœud, un identifiant de terme, un identifiant d'utilisateur. Sans ces informations, je ne suis pas en mesure d'utiliser le target_id pour obtenir le nom de la balise.

Comment puis-je obtenir tous les noms d'un champ de référence d'entité?

7
No Sssweat

La façon la plus simple d'obtenir ce que vous voulez est quelque chose comme ceci:

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

->entity Est une soi-disant propriété calculée, elle n'apparaît pas dans getValues(). Tous les champs de référence l'ont.

Et oui, oubliez print_r() sur l'entité ou d'autres objets complexes. Ils contiennent des objets qui se référencent et print_r() ne peut pas gérer cela. Si vous avez une entité, utilisez toujours print_r($entity->toArray()), alors vous obtenez uniquement les valeurs de champ. Vous pouvez installer le module devel ou utiliser un débogueur, mais cela vous donnera la structure interne d'une entité, ce que vous ne voulez pas vraiment voir.

19
Berdir

Un champ de référence d'entité, par définition, ne peut cibler qu'un seul type d'entité afin que vous puissiez savoir quel est votre type de cible en appelant getSetting() sur la définition du champ.

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

Ou mieux encore, utilisez EntityReferenceFieldItemList::referencedEntities() pour afficher les entités référencées du nœud et les données associées dont vous avez besoin.

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