Tengo un objeto de nodo con un campo de imagen llamado field_image
. Cuando lo hago
$node
->get('field_image')
->first()
->getValue()
Obtengo una matriz con algunas propiedades en lugar del objeto de entidad. La matriz se ve así:
'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
¿Tengo que cargar manualmente la entidad de archivo usando target_id
o hay una manera de obtener automáticamente el objeto de entidad referenciado de la instancia de Drupal\image\Plugin\Field\FieldType\ImageItem
?
¿Por qué la entidad referenciada no es accesible a través de getter? Podría tener una carga lenta si no está disponible de inmediato.
PHP Fatal error: Call to undefined method Drupal\image\Plugin\Field\FieldType\ImageItem::getTarget()
. Sin embargo$node->get('imagefield')->referencedEntities()
funciona gracias al hecho de que$node->get('imagefield')
devuelve la instancia de laEntityReferenceFieldItemList
cual implementa elreferencedEntities()
método. Por lo tanto, su solución es solo parcial: funciona para listas pero no para campos individuales.Respuestas:
El camino a la entidad referenciada es muy largo:
Por supuesto, todavía se puede obtener a través de una llamada de línea, pero aún así, es engorroso y me pregunto por qué
EntityReferenceItem
no proporciona un método que devuelva el objeto de entidad de referencia.También vale la pena señalar que es bastante fácil obtener una matriz de todas las entidades referenciadas:
Funciona porque para los campos de referencia de entidad
$node->get($field)
devuelve una instancia de laEntityReferenceFieldItemList
cual implementa elreferencedEntities()
método.fuente
Puedes usar:
$node->field_image->entity
si quieres el primer valor
fuente
$node->get('field_image')->entity
devuelve laFile
entidad. Sin embargo,$node->get('field_image')->getEntity()
devuelve laNode
entidad principal ! Entiendo que los métodos mágicos pueden ser utilizables, pero son PITA en proyectos más grandes. ¿Por qué molestarse en escribir interfaces y código oo si se nos anima a usar magia de todos modos? Escribiste que es bastante fácil de recordar una vez que lo hiciste , no estoy de acuerdo. Una vez que comience a hacer esto, desarrollará un hábito realmente malo que hará que su código sea menos legible y menos mantenible.Lo que funcionó para mí fue:
Las otras respuestas no produjeron la matriz de campos de entidad que esperaba
fuente
Para saber cómo obtener una entidad de un campo referenciado. Estoy de acuerdo con @SiliconMind sobre entidades referenciadas, devuelve una matriz de objetos de entidad con clave por deltas de elementos de campo.
Así de simple:
$node->get('field_name')->referencedEntities();
EntityReferenceFieldItemList :: referencedEntities
fuente