web-dev-qa-db-fra.com

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

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é?

24
user66519

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 à plusieurs valeurs, 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 propriété entity 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();
32
Yusef

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

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

La propriété entity 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_id n'est pas nécessaire, car il s'agit de la propriété principale et utilisé 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;
11
4k4

Vous devez être conscient de la différence entre un champ à valeur unique et un champ à valeurs multiples. Le code ci-dessous montre comment. Source: https://stefvanlooveren.me/blog/how-programmatically-update-entity-reference-field-drupal-8

$imageIds = [
  '3',
  '32',
  '50'
];
foreach($imageIds as $index => $fid) {
  if($index == 0) {
    $node->set('field_article_images', $fid);
  } else {
    $node->get('field_article_images')->appendItem([
      'target_id' => $fid,
    ]);
  }
}
2
Stef Van Looveren