web-dev-qa-db-fra.com

Comment supprimer par programme une valeur de champ de référence?

J'ai un champ de référence de taxonomie à plusieurs valeurs nommé field_classrooms dans un type de nœud. J'utilise le code ci-dessous pour supprimer la valeur dans le champ.

$node = Drupal\node\Entity\Node::load('1512');
unset($node->field_classrooms[0]);
$node->save();

Je ne peux pas comprendre ce que je fais mal ici.

3
Pravin Ajaaz

Peut-être que quelque chose comme ça pourrait vous aider

// Get the list of the associated classrooms ...
$classrooms = $node->get('field_classrooms')->getValue();
// ... if there are any associated classrooms ...
if(!empty($classrooms)) {
  foreach($classrooms as $classroom) {
    // ... get the key of the classroom
    $key = array_search(current($classroom), array_column($classrooms, key($classroom)));
    // ... remove the relationship ...
    $node->get('field_classrooms')->removeItem($key);
  }
  // ... and save the node.
  $node->save();
}

Si vous souhaitez supprimer une seule classe de la liste et que vous connaissez déjà la liste

private function removeClassroomFromNode($node, $tid) {
  if(null != $node) {
    // ... get the list of associated classrooms
    $classrooms = $node->get('field_classrooms')->getValue();
    // ... get the key of the classroom
    $key = array_search($tid, array_column($classrooms, 'target_id'));
    // ... remove the classroom
    $node->get('field_classrooms')->removeItem($key);
    // ... save the node.
    $node->save();
  }
}
7
Rockabelly

Vous pouvez utiliser le code ci-dessous pour supprimer des éléments dans le champ de référence dans Drupal 8:

/** @var \Drupal\Core\Entity\ContentEntityBase $entity */
$entity = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

$tids = $entity->get('field_classrooms')->getValue();

$updatedTerms = [];
foreach($tids as $term) {
  if ($term['target_id'] != 35)
    $updatedTerms[] = ['target_id' => $term['target_id']];      
}

$entity->field_notifications = $updatedTerms;

$entity->save();
2
Vernit Gupta

En attendant, vous pouvez obtenir de l'aide de ce code -

$node = \Drupal\node\Entity\Node::load('1512');
// Removes '0' index element.
$node->set('field_classrooms', array_slice($node->get('field_classrooms')->getValue(), 1));
$node->save();
1
Ashish Deynap

Vous pouvez supprimer le premier élément d'une liste en appelant simplement

$node->get('field_classrooms')->removeItem(0);
0
Oriol Almirall