エンティティ参照フィールドをプログラムで更新する


23

次のようなコードを使用して、Drupal 7のエンティティ参照フィールドを更新(または値を設定)できることを知っています。

 $node['field_code_used_by'][LANGUAGE_NONE][0]['target_id'] = $id;

Drupal 8のユーザーエンティティ参照フィールドの値をプログラムで設定したい。

私は試した$node->field_code_used_by->setValue(1);し、$node->field_code_used_by->entity->value = 1;どちらもそれらの働きました。

エンティティ参照フィールドの値を設定するにはどうすればよいですか?

回答:


31

次のようなコードを使用する必要があります。

    $node = Node::load($nid);     
    $node->field_code_used_by->target_id = $user_id;
    $node->save();

マルチプルバリューフィールドの場合、リストの最後に値を追加するには、次のコードを使用します。

$node->field_code_used_by[] = ['target_id' => $user_id];

別の方法はentity、次のコードのように、エンティティオブジェクトでプロパティを設定することです。

    $node = Node::load($nid);
    $user = \Drupal\user\Entity\User::load(1);
    $node->field_code_used_by->entity = $user;
    $node->save();

2
これは、親ノードが既に存在しない限り機能しないようです。target_idまたはエンティティプロパティを新しい未保存の親ノードに割り当てると、関係は保存されません。(おそらく、NULLエンティティrefフィールドに割り当てるときにも機能しませんが、私はそれをテストしていません。)このケースに対処する方法は誰でも知っていますか?
アーロンバウマン

@aaronbauman解決策はありましたか?
エコー

@echoどのように、またはこれを回避したかは覚えていません。動作の説明が正確であれば、これはバグです。drupal.orgで未解決の問題がない場合は、
aaronbauman

@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624は、新しいノードでその機能を動作させるのに役立ちました。バグではないようです。
エコー

11

D7と同様に、D8の参照フィールドの主なプロパティはtarget id次のとおりです。

$node->field_code_used_by->target_id = $user_id;

entityプロパティは、計算された値です。この値にオブジェクトを入れると、drupalはdababaseに保存する前にidに変換し直します。

多値フィールド

複数値フィールドにアイテムを追加します。

$node->field_code_used_by[] = ['target_id' => $user_id];

このプロパティtarget_idはメインプロパティであり、デフォルトで使用されるため、必要ありません。そのため、ほとんどのフィールドでは、簡単なphp配列のように値を追加できます。これは覚えやすいです。

$node->field_code_used_by[] = $user_id;

複数の値を許可するエンティティ参照フィールドはどうですか?
ブライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.