web-dev-qa-db-ja.com

参照エンティティのインスタンスを取得するにはどうすればよいですか?

field_imageという名前の画像フィールドを持つノードオブジェクトがあります。私がする時

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

エンティティオブジェクトの代わりに、いくつかのプロパティを持つ配列を取得します。配列は次のようになります。

'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

target_idを使用してファイルエンティティを手動でロードする必要がありますか、またはDrupal\image\Plugin\Field\FieldType\ImageItemのインスタンスから参照されるエンティティオブジェクトを自動的に取得する方法はありますか?

参照されたエンティティにゲッター経由でアクセスできないのはなぜですか?すぐに利用できない場合は、遅延ロードされる可能性があります。

35
SiliconMind

参照されるエンティティへのパスは非常に長いです:

_// $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.
_

もちろん、1回のライナー呼び出しでそれを取得することはできますが、それでも面倒で、EntityReferenceItemが参照エンティティオブジェクトを返すメソッドを提供しないのはなぜでしょうか。

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

また、すべての参照エンティティの配列を取得するのは非常に簡単であることにも注意してください。

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

エンティティ参照フィールドの場合、$node->get($field)は、referencedEntities()メソッドを実装するEntityReferenceFieldItemListのインスタンスを返すため、機能します。

66
SiliconMind

以下を使用できます。

$node->field_image->entity

最初の値が必要な場合

32
larowlan

参照フィールドからエンティティを取得する方法について。参照項目エンティティに関する@SiliconMindに同意します。フィールドアイテムデルタによってキー設定されたエンティティオブジェクトの配列を返します。

単純な:

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

EntityReferenceFieldItemList :: referencedEntities

10
Carlos

私のために働いたのは:

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

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

他の回答では、期待していたエンティティフィールド配列が生成されませんでした

7
AlxVallejo