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
のインスタンスから参照されるエンティティオブジェクトを自動的に取得する方法はありますか?
参照されたエンティティにゲッター経由でアクセスできないのはなぜですか?すぐに利用できない場合は、遅延ロードされる可能性があります。
参照されるエンティティへのパスは非常に長いです:
_// $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
のインスタンスを返すため、機能します。
以下を使用できます。
$node->field_image->entity
最初の値が必要な場合
参照フィールドからエンティティを取得する方法について。参照項目エンティティに関する@SiliconMindに同意します。フィールドアイテムデルタによってキー設定されたエンティティオブジェクトの配列を返します。
単純な:
$node->get('field_name')->referencedEntities();
私のために働いたのは:
$entity_id = $node->get('field_contact')->first()->getValue()['target_id'];
$entity = Node::load($entity_id)->toArray();
他の回答では、期待していたエンティティフィールド配列が生成されませんでした