web-dev-qa-db-fra.com

Comment obtenir une instance d'entité référencée?

J'ai un objet nœud avec un champ d'image nommé field_image. Quand je fais

$node
  ->get('field_image')
  ->first()
  ->getValue()

J'obtiens un tableau avec quelques propriétés au lieu d'un objet entité. Le tableau ressemble à ceci:

'target_id' => string '8' (length=1)
'alt' => string '' (length=0)
'title' => string '' (length=0)
'width' => string '587' (length=3)
'height' => string '458' (length=3)
'_loaded' => boolean true
  '_accessCacheability' => 
    object(Drupal\Core\Cache\CacheableMetadata)[1092]
      protected 'cacheContexts' => 
        array (size=0)
          ...
      protected 'cacheTags' => 
        array (size=0)
          ...
      protected 'cacheMaxAge' => int -1

Dois-je charger manuellement l'entité de fichier à l'aide de target_id ou il existe un moyen d'obtenir automatiquement l'objet entité référencé à partir de l'instance de Drupal\image\Plugin\Field\FieldType\ImageItem?

Pourquoi l'entité référencée n'est pas accessible via getter? Il peut être chargé paresseux s'il n'est pas disponible immédiatement.

35
SiliconMind

Le chemin vers l'entité référencée est très long:

// $id = some node ID
// $field = field name for entity reference field
$node = Node::load($id);

/** @var \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $referenceItem */
$referenceItem = $node->get($field)->first();

/** @var \Drupal\Core\Entity\Plugin\DataType\EntityReference $entityReference */
$entityReference = $referenceItem->get('entity');

/** @var \Drupal\Core\Entity\Plugin\DataType\EntityAdapter $entityAdapter */
$entityAdapter = $entityReference->getTarget();

/** @var \Drupal\Core\Entity\EntityInterface $referencedEntity */
$referencedEntity = $entityAdapter->getValue();

// At this point $referencedEntity is the referenced entity object.

Bien sûr, on peut toujours l'obtenir via un seul appel, mais c'est toujours lourd et je me demande pourquoi EntityReferenceItem ne fournit pas de méthode qui retournerait l'objet entité de référence.

$referencedEntity = $node
  ->get($field)
  ->first()
  ->get('entity')
  ->getTarget()
  ->getValue()
;

Il convient également de noter qu'il est assez facile d'obtenir un tableau de toutes les entités référencées:

$node->get($field)->referencedEntities();

Cela fonctionne parce que pour les champs de référence d'entité $node->get($field) renvoie l'instance de EntityReferenceFieldItemList qui implémente la méthode referencedEntities().

66
SiliconMind

Vous pouvez utiliser:

$node->field_image->entity

si vous voulez la première valeur

32
larowlan

Pour savoir comment obtenir une entité à partir d'un champ référencé. Je suis d'accord avec @SiliconMind sur referencedEntities, il renvoie un tableau d'objets d'entité saisis par des deltas d'élément de champ.

C'est simple:

$node->get('field_name')->referencedEntities();

EntityReferenceFieldItemList :: referencedEntities

10
Carlos

Ce qui a fonctionné pour moi, c'est:

$entity_id = $node->get('field_contact')->first()->getValue()['target_id'];

$entity = Node::load($entity_id)->toArray();

Les autres réponses n'ont pas produit le tableau des champs d'entité que j'attendais

7
AlxVallejo