9.11.2. Entiteiten programmatisch toevoegen, bijwerken en verwijderen
Werken met entiteiten in Drupal is gestandaardiseerd, en alle CRUD-bewerkingen (Create, Read, Update, Delete) verlopen op dezelfde manier voor alle entiteitstypen. In dit artikel bekijken we hoe we met entiteiten kunnen werken in aangepaste code.
Laten we beginnen met eenvoudige voorbeelden.
Node programmatisch aanmaken
use \Drupal\node\Entity\Node;
$node = Node::create([
'type' => 'article',
'title' => 'Druplicon test',
]);
$node->save();
Om een node aan te maken, moet je alle verplichte velden invullen — standaard is dat alleen het veld Title. Je kunt ook toegang krijgen tot het node-object na het aanmaken:
$node = Node::create([
'type' => 'article',
'title' => 'Druplicon test',
]);
$node->field_text->value = 'Eenvoudige tekst';
$node->save();
De methode create()
bevindt zich in de klasse Node.php. Als een entiteitstype zijn eigen create()
-methode heeft, is het beter om die te gebruiken. Er bestaan echter ook universele manieren om een entiteit aan te maken:
$node_entity_type = \Drupal::entityTypeManager()->getDefinition('node');
$node = new Node([
$node_entity_type->getKey('bundle') => 'movie',
$node_entity_type->getKey('label') => 'Foo',
'field_release_date' => '1/1/2015',
]);
$node->save();
Uiteindelijk slaan we de entiteit op met de methode save()
.
Node (entiteit) programmatisch bijwerken
$nid = 234;
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);
$node->title = 'Nieuwe titel';
$node->field_text = 'tekst';
$node->save();
Meer details over het bewerken van entiteitsvelden vind je in het vorige artikel:
http://drupalbook.org/drupal/9111-work-entity-fields-programmatically
Node (entiteit) programmatisch verwijderen
Als je slechts één node wilt verwijderen, kan dat eenvoudig met de methode delete()
:
$nid = 123;
$node = node_load($nid);
$node->delete();
Meerdere nodes (entiteiten) programmatisch aanmaken
Wanneer je veel nodes moet laden, is het inefficiënt om dat één voor één te doen, omdat elke node meerdere velden bevat en het ophalen van de gegevens meerdere SQL-query’s vereist. Het is veel sneller om alle nodes in één keer te laden:
$nids = db_select('node_field_data', 'n')
->fields('n', ['nid'])
->condition('title', $my_title)
// De tag node_access controleert toegangsrechten.
->addTag('node_access')
->execute()
->fetchCol();
$nodes = Node::loadMultiple($nids);
Meerdere nodes (entiteiten) programmatisch verwijderen
$result = \Drupal::entityQuery("node")
->condition('created', strtotime('-30 days'), '<=')
->execute();
$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);