9.13. Arbeiten mit der Datenbank in Drupal
Es ist ein häufiger Anwendungsfall bei der Entwicklung von Drupal-Modulen, Datenbankabfragen auszuführen. Sie sollten entityQuery verwenden, wo es möglich ist, aber manchmal ist es nötig, eine SQL-Abfrage zu nutzen, um komplexere Daten zu erhalten.
Sie können sich diese Seite als Lesezeichen speichern, um immer eine praktische Übersicht zu haben, wie man MySQL-Abfragen select, insert, update, delete in Drupal ausführt.
Select
Einzelnen Wert erhalten:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->addField('n', 'nid');
$query->condition('n.title', 'About Us');
$query->range(0, 1);
$nid = $query->execute()->fetchField();
Eintrag als Array erhalten:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->range(0, 1);
$vegetable = $query->execute()->fetchAssoc();
Sie können auch ->fetchObject(), ->fetchAll() verwenden, um Einträge als Objekte zu erhalten.
LIKE in der Abfrage verwenden:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->condition('n.title', $query->escapeLike('About') . '%', 'LIKE');
$vegetable = $query->execute()->fetchAllKeyed();
Select-Abfrage mit JOIN:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->addField('u', 'name');
$query->join('users_field_data', 'u', 'u.uid = n.uid');
$query->condition('n.type', 'page');
$vegetable = $query->execute()->fetchAllAssoc('nid');
Nachfolgend finden Sie Beispiele für andere Datenbankabfragen: insert, update, upsert und delete. Diese Abfragen können beim Arbeiten mit benutzerdefinierten Tabellen nützlich sein. Es ist jedoch besser, zweimal darüber nachzudenken, bevor man eigene Tabellen verwendet. Es ist vorzuziehen, die Drupal-API oder Contrib-Module zu nutzen. Wenn Sie sich dennoch entscheiden, eigene Datenbankabfragen zu schreiben, finden Sie hier Beispiele:
Insert
$query = \Drupal::database()->insert('flood');
$query->fields([
'event',
'identifier'
]);
$query->values([
'My event',
'My indentifier'
]);
$query->execute();
Sie können values() mehrfach aufrufen, um mehrere Datensätze gleichzeitig einzufügen.
Update
$query = \Drupal::database()->update('flood');
$query->fields([
'identifier' => 'My new identifier'
]);
$query->condition('event', 'My event');
$query->execute();
Upsert
$query = \Drupal::database()->upsert('flood');
$query->fields([
'fid',
'identifier',
]);
$query->values([
1,
'My indentifier for upsert'
]);
$query->key('fid');
$query->execute();
Die Methode key() dient dazu, den Namen des Feldes zu beschreiben, das zum Bestimmen des vorhandenen Datensatzes verwendet wird. Sie müssen keine condition() schreiben, Sie können die Methode key() verwenden. Das in key() verwendete Feld muss eindeutig sein, z. B. nid, uid, tid, fid oder andere IDs von Entitäten. Wenn der Schlüssel nicht existiert, wird anstelle eines Updates ein neuer Datensatz mit dem angegebenen Schlüssel eingefügt.
Delete
$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();
Das war's. Wenn Sie mehr Beispiele benötigen, schreiben Sie in die Kommentare. In den nächsten Tutorials werden wir uns ansehen, wie man benutzerdefinierte Drupal-Datenbankabfragen praktisch verwendet.