エンティティ(ノードなど)オブジェクトのフィールド値にアクセスするにはどうすればよいですか?


63

node_load((int) $nid)完全に読み込まれたノードエンティティをロードします。$node->title->valueはタイトルを取得しますが、Drupal 8でフィールド値にアクセスするにはどうすればよいですか?

回答:


89

私はあなたが$entity配列に変換する必要はないと思います、これは単に機能するでしょう。

$entity->get('field_name')->getValue();

FYI:使用kint()からdevel_kintモジュールは、あなたがオブジェクトの要素にアクセスするために使用することができ、すべての利用可能な方法をお知らせしますので、比較的var_dump()少ない便利です。


14
実際には次のようになります:$ entity-> get( 'field_name')-> value;
エドホリングハースト

1
これが@EdHollinghurstである理由を知っていますか?getValueは実際にエラーを出しますが、(dpmを使用して)利用可能なメソッドにリストされていますが、「value」はリストされていません。
自己造血

2
getValue()私のために動作します(8.1.xと8.2.xの両方で)APIリファレンスを参照してください
-leon.nk

16
->getValue()は汎用的であり、フィールドタイプに関係なく機能します。を使用する->value場合、フィールド値がvalueプロパティに保存されている場合にのみ機能します。より複雑なタイプ(日付やエンティティ参照など)では機能しません。
ピエールバイル

4
エンティティに「field_name」という名前のフィールドがない場合、このコードだけでエラーがスローされます。このコードが、フィールドが存在することがわかっているエンティティでのみ実行されることを確認します。$ entity-> hasField( 'field_name')を使用してテストするか、if(!empty($ entity-> field_name))
oknate

56

drupal 8では、$ nodeはクラスnodeです

 $node->field_machine_name->getValue();

または

$node->get('field_machine_name')->getValue();

値の配列を返します。

1つだけが必要な場合は、配列を文字列化することもできます。

$node->field_machine_name->getString();

または

 $node->get('field_machine_name')->getString();

「取得」(文字列と値)「それ」はしません。この答えを説明するために、さらに詳細を追加していただけますか?参考:そうしないと、回答がモデレートによって削除される危険性があります(ごめん...)
Pierre.Vriens

34

フィールドについては$node->body->value、たとえば使用できるはずです。フィールド名がわからない場合は、Drupal 8のDevelモジュールをインストールし、などでノードを検査することをお勧めしますdsm($node)


1
そのフィールドをどのようにレンダリングしますか?
アレックス

1
これは時代遅れのようです
アレックス

1
@Alexあなたが抱えている問題について、新しい質問をすることをお勧めします。これは大丈夫な答えでしたが、今はこのページの回答であり、これよりも多くの点がある回答を編集することは不自然なようです。
テンケン

5
良い説明については、この記事を確認してください。$ node-> field_name-> valueを使用して、単一の値(または複数値フィールドの最初のキー)を取得できます。または、$ node-> field_name-> getValue()を使用して、フィールドのすべての値を配列として取得できます。
Mirsoft

2
@tenken:実際には、既存の回答を更新することは、新しい回答で冗長な質問を追加するよりも望ましいです。
ピエールバイル

17

$entity->toArray()エンティティ内の内容をいつでも確認できます。(たとえばphpstormで)xdebugを使用する場合でも、エンティティオブジェクトを単独で理解することは非常に困難です。dsm($node)Drupal 8には意味がないと思う。ブラウザ内デバッグを主張する場合(ただし、Drupal 8は複雑すぎてxdebugなしでデバッグすることはできません)dsm($node->toArray())が必要です。


$ノード- >のtoArray()のDrupal 8の上に私のために動作しません
アクセルBriche

それについて詳しく説明する新しい質問を追加してください。Drupal\Core\Entity\EntityInterface持っていtoArrayます。

1
この答えは解決策を提供しません。ダウン投票。
コラン

この答えは必ずしもこの質問に対する直接的な答えではありませんが、非常に優れた機能です。ありがとう。
スティーフ・ヴァン・ローバーレン

14

次のコードスニペットを使用して、ノードフィールド値を取得します

これは、URLからノードIDを取得するために使用されます

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

nidを使用してノードデータをロードするには

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

これは、フィールド値を取得するために使用されます。

$terms = $node->get('field_Name')->getValue();  

これは、ノードのタイトルを取得するために使用されます。

$product_name = $node->getTitle();

2
次のようなノードをロードします。$ nid = \ Drupal :: routeMatch()-> getRawParameter( 'node'); $ node = \ Drupal :: entityTypeManager()-> getStorage( 'node')-> load($ nid);
レミー

8

私にとって、$entityこれは(ノード)を持っています:

$entity->field_name->getValue();

8.1を使用します。


2
これは、複数値フィールドのすべての値を配列に取得します。もちろん、単一値フィールドの値を取得するためにも使用できますが、出力には単一値の配列が含まれます。フィールドの単一値(または複数値フィールドの最初の値)を取得するには、$ entity-> field_name-> value
Mirsoft

7

使用中(実際の正しい方法):

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();


4

それは単純です:

$node->get('field_name')->getValue()

フィールドがエンティティ参照フィールドである場合、参照されるエンティティを取得する特別な方法がいくつかあります。

ターゲットID(最初の要素)を取得するには:

$entity->get('field_entity_reference')->target_id

ロードされたエンティティ(最初の要素)を取得するには:

$entity->get('field_entity_reference')->entity

使用している場合->entity、フィールドには、自動的にエンティティをロードします。

フィールドに複数の参照を含めることができる場合、次のようにそれらをすべて取得できます。

$entities = $entity->get('field_entity_reference')->referencedEntities();

これにより、エンティティの配列が得られます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.