プログラムでエンティティ参照フィールドのすべての名前を取得する


10

例:ノード5のfield_tags内にあるすべてのタグ名を取得たい。

$ node-> field_tags-> getValue()で target_idを取得できます。

ここに画像の説明を入力してください

しかし問題は、target_idの値がどのエンティティに属しているかがわからないことです。ノードID、用語ID、ユーザーIDの可能性があります。その情報がないと、target_idを使用してタグの名前を取得できません。

エンティティ参照フィールドのすべての名前を取得するにはどうすればよいですか?

回答:


20

あなたが欲しいものを手に入れる最も簡単な方法は次のようなものです:

$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モジュールをインストールするか、デバッガーを使用することもできますが、これによりエンティティーの内部構造が得られます。


2
$node->toArray();確かに使用するよりもはるかに短くきれいに見えます\Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'article');
いいえSssweat

これに関するドキュメントはどこにありますか?
AlxVallejo 2018

たとえば、ここにいくつかの情報を見つけることができます:drupal.org/docs/8/api/entity-api
Berdir

@Berdir:print_r($entity->toArray())この問題を解決します。すべてのフィールドの詳細を取得できます。どうもありがとうございます。
カリダサン

@Berdirあなたはドキュメントについてより具体的にできますか?私はそのページを調べてきましたが、用語参照フィールドに関連する具体的な例はありません。
ケベン

6

エンティティ参照フィールドは、定義上、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インスタンスをアップグレードしました。
Sssweatなし16

これが別の質問であるかどうか教えてください。名前の値にアクセスするにはどうすればよいですか。配列に値:protectedと表示されている場合は、クラス内でのみアクセスできます。
Sssweatなし16

あなたの答えを受け入れないことについて私は気分が悪いですが、@ Berdirの答えは私に仕方がありませんでした。私はあなたのOr better yet方法を使用して値を取得する方法を理解していません。最初の方法は適切ですが、ifステートメントでターゲットタイプをチェックしてから値を取得する必要があります。チェックの必要がないため、Berdirの答えはより効率的です。
Sssweatなし16

1
汗をかいてはいけません(... 質問の最初のバージョンは、目的が明確ではありませんでした。最適な答えをマークしてください。
Shawn Conn

この回答がこのSOの投稿に埋め込まれていないことを願っています。私はフィールドtarget_typeから値を取得したいと思って、entity_reference高低で検索しました...ここで私の質問に答えるまで。
Keven
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.