Как получить экземпляр ссылочного объекта?

У меня есть объект-узел с полем изображения с именем field_image. Когда я делаю

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

Я получаю массив с некоторыми свойствами вместо объекта entity. Массив выглядит следующим образом:

'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

Нужно ли мне manullay загружать объект файла с помощью target_id или есть способ автоматически получить объект сущности, на который ссылается объект из экземпляра Drupal\image\Plugin\Field\FieldType\ImageItem

Почему ссылочный объект недоступен через getter? Он может быть ленивым, если он недоступен сразу.

24 голоса | спросил SiliconMind 10 Jpm1000000pmSun, 10 Jan 2016 16:59:55 +030016 2016, 16:59:55

3 ответа


47

Путь к ссылочному объекту очень длинный:

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

Конечно, все равно можно получить его через один вызов liner, но все же, это громоздко, и мне интересно, почему EntityReferenceItem не предоставляет метод, который бы возвращал объект ссылочной сущности.

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

Также стоит отметить, что получить массив всех ссылочных объектов довольно легко:

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

Это работает, потому что для ссылочных полей сущностей $node->get($field) возвращает экземпляр EntityReferenceFieldItemList, который реализует referencedEntities() метод.

ответил SiliconMind 10 Jpm1000000pmSun, 10 Jan 2016 17:24:52 +030016 2016, 17:24:52
27

Вы можете использовать:

$node->field_image->entity

, если вы хотите получить первое значение

ответил larowlan 10 Jpm1000000pmSun, 10 Jan 2016 22:51:53 +030016 2016, 22:51:53
3

Что для меня работало:

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

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

Другие ответы не привели массив массивов объектов, который я ожидал

ответил AlxVallejo 19 MarpmMon, 19 Mar 2018 18:26:22 +03002018-03-19T18:26:22+03:0006 2018, 18:26:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132