Programmgesteuert alle Namen eines Entitätsreferenzfelds abrufen

7

Beispiel: Ich möchte alle Tag-Namen erhalten , die sich in field_tags von Knoten 5 befinden.

Ich kann die target_id mit getValues ​​() abrufen .

Geben Sie hier die Bildbeschreibung ein

Das Problem ist jedoch, dass ich nicht weiß, zu welcher Entität der Wert target_id gehört. Könnte eine Knoten-ID, eine Term-ID oder eine Benutzer-ID sein. Ohne diese Informationen kann ich die target_id nicht verwenden, um den Namen des Tags abzurufen.

Wie kann ich alle Namen eines Entitätsreferenzfelds abrufen?

Kein Sssweat
quelle

Antworten:

19

Der einfachste Weg, um das zu bekommen, was Sie wollen, ist ungefähr so:

$names = [];
foreach ($node->field_tags as $item) {
  if ($item->entity) {
    $names[$item->entity->id()] = $item->entity->label();
  }
}

->entityist eine sogenannte berechnete Eigenschaft, in der sie nicht angezeigt wird getValues(). Alle Referenzfelder haben es.

Und ja, vergessen Sie print_r()Entitäten oder andere komplexe Objekte. Sie enthalten Objekte, die aufeinander verweisen, und print_r()können damit nicht umgehen. Wenn Sie eine Entität haben, verwenden print_r($entity->toArray())Sie immer , dann erhalten Sie nur die Feldwerte. Sie könnten das Entwicklungsmodul installieren oder einen Debugger verwenden, aber das gibt Ihnen die interne Struktur einer Entität, die Sie nicht wirklich sehen möchten.

Berdir
quelle
2
$node->toArray();sieht sicher viel kürzer und sauberer aus als mit\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
No Sssweat
Wo finden Sie Dokumentation dazu?
AlxVallejo
Sie können einige Informationen hier zum Beispiel finden: drupal.org/docs/8/api/entity-api
Berdir
@Berdir: print_r($entity->toArray())Es löst dieses Problem. Ich kann alle Felddetails abrufen. Ich danke dir sehr.
Kalidasan
@Berdir können Sie die Dokumentation genauer beschreiben? Ich habe diese Seite durchgesehen, sehe jedoch keine spezifischen Beispiele für Referenzfelder.
Keven
5

Ein Entitätsreferenzfeld kann per Definition nur auf einen Entitätstyp abzielen, sodass Sie durch Aufrufen getSetting()der Felddefinition wissen, was Ihr Zieltyp ist .

// Print the targeted entity type field.
$field = \Drupal\field\Entity\FieldStorageConfig::loadByName('node','field_tags');
echo $field->getSetting('target_type');

Oder noch besser, verwenden Sie EntityReferenceFieldItemList::referencedEntities()diese Option, um die referenzierten Entitäten des Knotens und die zugehörigen Daten aufzurufen, die Sie benötigen.

// Return an array of Entity objects referenced in the field.
$node->field_tags->referencedEntities();
Shawn Conn
quelle
print_r($node->field_tag->referencedEntities());Es scheint ein Ressourcenfresser zu sein, ich hatte meine AWS- Instanz aktualisiert , nur um dies tun zu können, da ich immer wieder WSOD bekam.
Kein Sssweat
Lassen Sie mich wissen, ob dies eine separate Frage sein sollte. Wie kann ich auf den Namenswert zugreifen, wenn im Array Werte angegeben sind: protected, was bedeutet, dass nur innerhalb der Klasse darauf zugegriffen werden kann.
Kein Sssweat
Ich habe ein schlechtes Gefühl, wenn ich Ihre Antwort nicht akzeptiere, aber die Antwort von @Berdir gab mir keine andere Wahl als zu. Ich habe nie herausgefunden, wie ich den Wert mit Ihrer Or better yetMethode ermitteln kann. Die erste Methode ist gut, erfordert jedoch if-Anweisungen, um den Zieltyp zu überprüfen und dann den Wert abzurufen. Berdirs Antwort ist effizienter, da keine Überprüfungen erforderlich sind.
Kein Sssweat
1
Schwitzen Sie nicht (... Wortspiel beabsichtigt). Die erste Version Ihrer Frage war für Ihr Ziel nicht klar. Sie sollten die Antwort markieren, die am besten passt.
Shawn Conn
Ich wünschte wirklich, diese Antwort wäre nicht in diesem SO-Beitrag vergraben. Ich wollte den target_typeWert aus einem entity_referenceFeld abrufen und suchte hoch und niedrig danach ... bis Sie meine Frage hier beantwortet haben.
Keven