Ich habe ein Knotenobjekt mit dem Namen Bildfeld field_image
. Wenn ich es tue
$node
->get('field_image')
->first()
->getValue()
Ich erhalte ein Array mit einigen Eigenschaften anstelle eines Entitätsobjekts. Das Array sieht folgendermaßen aus:
'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
Muss ich die Dateientität manuell laden, target_id
oder gibt es eine Möglichkeit, das referenzierte Entitätsobjekt automatisch von der Instanz von abzurufen Drupal\image\Plugin\Field\FieldType\ImageItem
?
Warum ist die referenzierte Entität nicht über Getter erreichbar? Es könnte faul geladen werden, wenn es nicht sofort verfügbar ist.
PHP Fatal error: Call to undefined method Drupal\image\Plugin\Field\FieldType\ImageItem::getTarget()
. Funktioniert jedoch$node->get('imagefield')->referencedEntities()
dank der Tatsache, dass eine$node->get('imagefield')
Instanz zurückgegeben wird,EntityReferenceFieldItemList
die diereferencedEntities()
Methode implementiert . Ihre Lösung ist also nur teilweise - sie funktioniert für Listen, aber nicht für einzelne Felder.Antworten:
Der Pfad zur referenzierten Entität ist sehr lang:
Natürlich kann man es immer noch über einen Linienaufruf erhalten, aber es ist immer noch umständlich und ich frage mich, warum
EntityReferenceItem
es keine Methode gibt, die das Referenzentitätsobjekt zurückgibt.Es ist auch erwähnenswert, dass es ziemlich einfach ist, eine Reihe von Entitäten zu erhalten, auf die verwiesen wird:
Dies funktioniert, weil für Entitätsreferenzfelder eine
$node->get($field)
Instanz zurückgegeben wird,EntityReferenceFieldItemList
die einereferencedEntities()
Methode implementiert .quelle
Sie können verwenden:
$node->field_image->entity
wenn Sie den ersten Wert wollen
quelle
$node->get('field_image')->entity
Gibt eineFile
Entität zurück. Allerdings$node->get('field_image')->getEntity()
gibt ElternNode
Einheit! Ich verstehe, dass magische Methoden verwendbar sein könnten, aber sie sind PITA in größeren Projekten. Warum sich die Mühe machen, Interfaces und OO-Code zu schreiben, wenn wir trotzdem ermutigt werden, Magie zu verwenden? Sie haben geschrieben, es ist leicht genug, sich daran zu erinnern, wenn Sie es getan haben - ich bin anderer Meinung. Sobald Sie dies tun, werden Sie eine schlechte Angewohnheit entwickeln, die Ihren Code weniger lesbar und weniger wartbar macht.Was bei mir funktioniert hat war:
Die anderen Antworten ergaben nicht das erwartete Array mit den Entitätsfeldern
quelle
Hier erfahren Sie, wie Sie eine Entität aus einem referenzierten Feld abrufen. Ich bin mit @SiliconMind über referencedEntities einverstanden, da es ein Array von Entitätsobjekten zurückgibt, die durch Feldelement-Deltas verschlüsselt sind.
Nur einfach:
$node->get('field_name')->referencedEntities();
EntityReferenceFieldItemList :: referencedEntities
quelle