例:ノード5のfield_tags内にあるすべてのタグ名を取得したい。
$ node-> field_tags-> getValue()で target_idを取得できます。
しかし問題は、target_idの値がどのエンティティに属しているかがわからないことです。ノードID、用語ID、ユーザーIDの可能性があります。その情報がないと、target_idを使用してタグの名前を取得できません。
エンティティ参照フィールドのすべての名前を取得するにはどうすればよいですか?
例:ノード5のfield_tags内にあるすべてのタグ名を取得したい。
$ node-> field_tags-> getValue()で target_idを取得できます。
しかし問題は、target_idの値がどのエンティティに属しているかがわからないことです。ノードID、用語ID、ユーザーIDの可能性があります。その情報がないと、target_idを使用してタグの名前を取得できません。
エンティティ参照フィールドのすべての名前を取得するにはどうすればよいですか?
回答:
あなたが欲しいものを手に入れる最も簡単な方法は次のようなものです:
$names = [];
foreach ($node->field_tags as $item) {
if ($item->entity) {
$names[$item->entity->id()] = $item->entity->label();
}
}
->entity
はいわゆる計算されたプロパティで、には表示されませんgetValues()
。すべての参照フィールドにそれがあります。
そして、はい、print_r()
エンティティや他の複雑なオブジェクトについては忘れてください。それらはお互いを参照するオブジェクトを含み、それprint_r()
を処理することができません。エンティティがある場合は、常にを使用してprint_r($entity->toArray())
、フィールド値のみを取得します。develモジュールをインストールするか、デバッガーを使用することもできますが、これによりエンティティーの内部構造が得られます。
print_r($entity->toArray())
この問題を解決します。すべてのフィールドの詳細を取得できます。どうもありがとうございます。
エンティティ参照フィールドは、定義上、1つのエンティティタイプのみをターゲットにできるためgetSetting()
、フィールド定義を呼び出すことで、ターゲットタイプを知ることができます。
// Print the targeted entity type field.
$field = \Drupal\field\Entity\FieldStorageConfig::loadByName('node','field_tags');
echo $field->getSetting('target_type');
あるいはEntityReferenceFieldItemList::referencedEntities()
、ノードの参照エンティティと必要な関連データをプルアップするために使用します。
// Return an array of Entity objects referenced in the field.
$node->field_tags->referencedEntities();
print_r($node->field_tag->referencedEntities());
私はWSODを取得し続けたので、それを実行できるようにするためだけに、AWSインスタンスをアップグレードしました。
Or better yet
方法を使用して値を取得する方法を理解していません。最初の方法は適切ですが、ifステートメントでターゲットタイプをチェックしてから値を取得する必要があります。チェックの必要がないため、Berdirの答えはより効率的です。
target_type
から値を取得したいと思って、entity_reference
高低で検索しました...ここで私の質問に答えるまで。
$node->toArray();
確かに使用するよりもはるかに短くきれいに見えます\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');