Arbeiten mit der Datenbank in Drupal 7 – Lektion 9 – Update-Abfragen (UPDATE)
Update-Abfragen sollten immer den Query-Builder verwenden. Unterschiedliche Datenbanken haben spezifische Handler für LOBs (Large OBjects, z. B. TEXT in MySQL) und BLOB-Felder (Binary Large OBjects), daher ist eine Abstraktionsschicht für die individuellen Treiber notwendig, um die spezifischen Handler zu implementieren.
Update-Abfragen beginnen mit der Funktion db_update()
:
<?php $query = db_update('node', $options); ?>
Mit diesem Update-Query-Objekt können eine oder mehrere Datensätze in der Tabelle node
geändert werden. Beachten Sie, dass keine geschweiften Klammern um den Tabellennamen nötig sind, der Query-Builder erledigt das automatisch.
Das Update-Query-Objekt verwendet eine Fluent API. Das heißt, alle Methoden (außer execute()
) geben das Query-Objekt zurück, sodass Methoden verketten möglich ist. Häufig wird das Query-Objekt daher nicht in einer Variablen gespeichert.
Update-Abfragen bestehen aus einer Menge Schlüssel-Wert-Paare, die mit Bedingungen via WHERE kombiniert werden. Die genaue Funktionsweise von WHERE wird in einer späteren Lektion erklärt. Hier nur ein Beispiel:
<?php /* Dieses einfache Beispiel aktualisiert Datensätze in der Tabelle node */ $num_updated = db_update('node') ->fields(array( 'uid' => 5, 'status' => 1, )) ->condition('created', REQUEST_TIME - 3600, '>=') ->execute(); ?>
Das Beispiel entspricht dem SQL-Befehl:
UPDATE {node} SET uid=5, status=1 WHERE created >= 1221717405;
Das Beispiel aktualisiert alle Einträge in node
, die in der letzten Stunde erstellt wurden, und setzt uid
auf 5 und status
auf 1. Die Methode fields()
erhält ein assoziatives Array mit den zu aktualisierenden Feldern und ihren neuen Werten. Im Unterschied zu Insert-Abfragen akzeptiert UpdateQuery::fields()
nur assoziative Arrays. Die Reihenfolge der Felder im Array oder in den Methodenaufrufen ist dabei unerheblich.
Die Methode execute()
gibt die Anzahl der tatsächlich geänderten Zeilen zurück. Beachten Sie, dass dies nicht unbedingt alle Zeilen sind, die die WHERE-Bedingung erfüllen. So werden beispielsweise Zeilen, bei denen uid=5
und status=1
bereits gesetzt sind, nicht als geändert gezählt. Daher spiegeln Update-Abfragen nicht immer exakt wider, wie viele Datensätze aktuell diese Werte haben.