9.11.2. Entity programmatisch hinzufügen, aktualisieren und löschen
Die Arbeit mit Entitäten in Drupal ist vereinheitlicht, und alle CRUD-Operationen sind für alle Entitäten gleich. In diesem Artikel werden wir herausfinden, wie man mit Entitäten im eigenen Code arbeitet.
Schauen wir uns zuerst einfache Beispiele an.
Knoten programmatisch erstellen
use \Drupal\node\Entity\Node;
$node = Node::create([
'type' => 'article',
'title' => 'Druplicon test',
]);
$node->save();
Um einen Knoten zu erstellen, müssen alle erforderlichen Felder hinzugefügt werden, standardmäßig ist dies nur das Feld Titel. Nach der Erstellung kann man auch auf das Knotenobjekt zugreifen:
$node = Node::create([
'type' => 'article',
'title' => 'Druplicon test',
]);
$node->field_text->value = 'Einfacher Text';
$node->save();
Die Methode create() befindet sich in der Node.php Klasse; wenn ein Entitätstyp eine eigene create()-Methode hat, ist es am besten, diese zu verwenden. Es gibt jedoch auch universelle Wege, eine Entität zu erstellen.
$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();
Am Ende speichern wir die Entität mit der save()-Methode.
Knoten (Entität) programmatisch aktualisieren
$nid = 234;
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);
$node->title = 'Neuer Titel';
$node->field_text = 'Text';
$node->save();
Details zum Bearbeiten von Entitätsfeldern haben wir im vorherigen Artikel behandelt:
http://drupalbook.org/drupal/9111-work-entity-fields-programmatically
Knoten (Entität) programmatisch löschen
Wenn Sie einen Knoten löschen wollen, können Sie die delete()-Methode verwenden:
$nid = 123;
$node = node_load($nid);
$node->delete();
Mehrere Knoten (Entitäten) programmatisch erstellen
Wenn Sie viele Knoten laden müssen, ist es ineffizient, sie einzeln zu laden, da jeder Knoten Felder hat und viele SQL-Abfragen nötig sind. Es ist viel schneller, alle Knoten auf einmal zu laden:
$nids = db_select('node_field_data', 'n')
->fields('n', ['nid'])
->condition('title', $my_title)
// Das node_access Tag prüft Zugriffsrechte.
->addTag('node_access')
->execute()
->fetchCol();
$nodes = Node::loadMultiple($nids);
Mehrere Knoten (Entitäten) programmatisch löschen
$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);