Mettre à jour par programme un champ de référence d'entité

23

Je sais que je peux mettre à jour (ou définir une valeur pour) un champ de référence d'entité dans Drupal 7 avec un code similaire au suivant.

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

Je veux définir par programme une valeur pour mon champ de référence d'entité utilisateur dans Drupal 8.

J'ai essayé avec $node->field_code_used_by->setValue(1);et $node->field_code_used_by->entity->value = 1;mais aucun d'eux n'a fonctionné.

Comment puis-je définir la valeur d'un champ de référence d'entité?

Jdrupal
la source

Réponses:

31

Vous devez utiliser un code similaire au suivant.

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

Pour un champ à valeurs multiples, pour ajouter la valeur à la fin de la liste, utilisez le code suivant.

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

Une autre façon consiste à définir la entitypropriété avec l'objet entité, comme dans le code suivant.

    $node = Node::load($nid);
    $user = \Drupal\user\Entity\User::load(1);
    $node->field_code_used_by->entity = $user;
    $node->save();
Yusef
la source
2
Cela ne semble fonctionner que si le nœud parent existe déjà. Lorsque vous affectez le target_id ou la propriété d'entité à un nouveau nœud parent non enregistré, la relation n'est pas enregistrée. (Peut-être que cela ne fonctionne pas non plus lors de l'affectation à un champ de référence d'entité NULL, mais je n'ai pas testé cela.) Quelqu'un sait comment résoudre ce cas?
aaronbauman
@aaronbauman avez-vous trouvé une solution?
écho le
@echo je ne me souviens pas comment ou si j'ai travaillé autour de ça. Si ma description du comportement est exacte, c'est un bug. S'il n'y a pas de problème ouvert sur drupal.org pour cela, il devrait y avoir
aaronbauman
@aaronbauman drupal.org/project/paragraphs/issues/2707017#comment-11872624 m'a aidé à faire fonctionner ce nouveau nœud. Cela ne semble donc pas être un bug.
faire écho le
11

Comme en D7, la propriété principale d'un champ de référence en D8 est toujours target id:

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

La entitypropriété est une valeur calculée. Si vous placez un objet dans cette valeur, drupal le reconvertira en id avant de l'enregistrer dans la base de données.

Champs à valeurs multiples

Ajoutez un élément à un champ à valeurs multiples:

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

La propriété target_idn'est pas nécessaire, car il s'agit de la propriété principale et utilisée par défaut. Donc, pour la plupart des champs, vous pouvez ajouter une valeur comme dans un simple tableau php, qui est facile à retenir:

$node->field_code_used_by[] = $user_id;
4k4
la source
Que diriez-vous des champs de référence d'entité qui autorisent plusieurs valeurs?
Brian