logo

Extra Block Types (EBT) - Neue Erfahrung im Layout Builder❗

Extra Block Types (EBT) - gestylte, anpassbare Blocktypen: Diashows, Registerkarten, Karten, Akkordeons und viele andere. Eingebaute Einstellungen für Hintergrund, DOM Box, Javascript Plugins. Erleben Sie die Zukunft der Layouterstellung schon heute.

Demo EBT-Module EBT-Module herunterladen

❗Extra Absatztypen (EPT) - Erfahrung mit neuen Absätzen

Extra Paragraph Types (EPT) - analoger, auf Absätzen basierender Satz von Modulen.

Demo EPT-Module EPT-Module herunterladen

Scroll

Arbeiten mit der Datenbank in Drupal 7 – Lektion 12 – Bedingungen in Abfragen (WHERE, HAVING, LIKE)

26/05/2025, by Ivan

Eine Abfragebedingung erlaubt es, nur Datensätze auszuwählen, die bestimmte Einschränkungen erfüllen, z. B. Nodes, die nicht älter als zwei Wochen sind, oder Begriffe, die das Wort „Drupal“ enthalten. In SQL verwenden wir WHERE und HAVING, um Bedingungen für SELECT-, UPDATE- oder DELETE-Abfragen zu definieren. In den dynamischen Abfragen von Drupal gibt es ebenfalls einen Mechanismus für Bedingungen, der für alle drei Abfragetypen gleich funktioniert: Auswahl, Aktualisierung, Löschung.

Konzept der Bedingungen

Eine Bedingung wird durch einen speziellen Ausdruck definiert, der eine Einschränkung vorgibt.

Kombination (Konjunktion)

Eine Bedingung kann aus mehreren Teilausdrücken bestehen, die miteinander verbunden werden. Die Verknüpfung erfolgt mittels AND (UND) und OR (ODER).

Bedingungsobjekt

Drupal stellt jeden Teil einer Bedingung als Instanz der Klasse QueryConditional dar. Ein Bedingungsobjekt ist eine Instanz dieser Klasse.

Beispiel einer SQL-Abfrage:

SELECT FROM {mytable} WHERE (a = 1 AND b = 'foo' OR (c = 'bar'))

Bedingungsausdruck:

WHERE (a = 1 AND b = 'foo' OR (c = 'bar'))

Teile des Ausdrucks:

(a = 1 AND b = 'foo' OR (c = 'bar'))
(c = 'bar')

Verknüpfungsoperatoren:

AND, OR

Die Objekte der SELECT-, UPDATE- und DELETE-Abfragen implementieren das Interface QueryConditionalInterface, welches Methoden für die drei Abfragetypen bereitstellt. Diese werden von der Klasse QueryConditional umgesetzt. Man kann QueryConditional auch direkt verwenden.

Jeder Bedingungsteil wird standardmäßig mit AND verknüpft. Mehrere Bedingungsteile können mit anderen Operatoren, z. B. OR, verbunden werden.

API

Es gibt zwei Hauptmethoden, um mit Bedingungsobjekten zu arbeiten:

$query->condition($field, $value = NULL, $operator = '=')

Die Methode condition() definiert Feld, Wert und Operator für eine Bedingung. Sie wird für binäre Vergleiche (WAHR/ FALSCH) verwendet wie =, <, >=, LIKE etc. Wird kein Operator angegeben, wird '=' als Standard angenommen. So kann man etwa condition('myfield', $value) schreiben, was zu myfield = :value übersetzt wird.

$query->where($snippet, $args = array())

Die Methode where() ist ein Zusatz, da condition() in den meisten Fällen bevorzugt wird. Im Parameter $snippet steht ein SQL-Schnipsel, und $args sind Platzhalterwerte. condition() sollte, wann immer möglich, genutzt werden.

Bedingungen mit Arrays

Für Bedingungen mit mehreren Werten kann ein Array übergeben werden. Die bekanntesten SQL-Operatoren sind IN und BETWEEN. IN prüft, ob ein Wert genau in der Liste der Werte im Array enthalten ist.

<?php
$query->condition('myfield', array(1, 2, 3), 'IN');
// Wird zu: myfield IN (:db_placeholder_1, :db_placeholder_2, :db_placeholder_3)
?>

So wählt man alle Datensätze aus, deren Wert in myfield 1, 2 oder 3 ist.

Für Bereichsbedingungen verwendet man BETWEEN:

<?php
$query->condition('myfield', array(5, 10), 'BETWEEN');
// Wird zu: myfield BETWEEN :db_placeholder_1 AND :db_placeholder_2
?>

Es werden alle Datensätze mit Werten zwischen 5 und 10 in myfield ausgewählt.

Verschachtelte Bedingungen

Der erste Parameter von condition() kann auch ein weiteres Bedingungsobjekt sein. So können verschachtelte komplexe Bedingungen mit AND und OR erstellt werden.

Der Helfer db_condition() erzeugt ein neues Bedingungsobjekt. Er nimmt als Parameter den Verknüpfungstyp. Es gibt fertige Helfer wie db_or(), db_xor(), db_and(), die meist ausreichen. Beispiel:

<?php
$query
  ->condition('field1', array(1, 2), 'IN')
  ->condition(db_or()->condition('field2', 5)->condition('field3', 6))
// Ergebnis:
// (field1 IN (:db_placeholder_1, :db_placeholder_2) AND (field2 = :db_placeholder_3 OR field3 = :db_placeholder_4))
?>

NULL-Werte

Für NULL-Werte nutzt man:

<?php
$query->isNull('myfield');
// Ergebnis: (myfield IS NULL)

$query->isNotNull('myfield');
// Ergebnis: (myfield IS NOT NULL)
?>

Diese Methoden können mit where() und condition() kombiniert werden.

Hinweis: Die Nutzung von condition('myfield', NULL) ist veraltet. Nutze stattdessen isNull() und isNotNull().

Unterabfragen

Die Methode condition() unterstützt auch Unterabfragen als Wert. Diese werden mit dem Objekt SelectQuery erzeugt, das durch db_select() erzeugt wird. Anstelle der Ausführung mit select() wird das Objekt an condition() übergeben.

Unterabfragen sind praktisch für kurze einfache Abfragen mit nur einem Feld. Für komplexere Abfragen empfiehlt es sich, condition() gezielt zu verwenden.

Beispiele:

db_delete()

<?php
db_delete('sessions')
  ->condition('timestamp', REQUEST_TIME - $lifetime, '<')
  ->execute();
// DELETE FROM {sessions} WHERE (timestamp < 1228713473)
?>

db_update()

<?php
db_update('sessions')
  ->fields(array(
    'sid' => session_id()
  ))
  ->condition('sid', $old_session_id)
  ->execute();
// UPDATE {sessions} SET sid = 'abcde' WHERE (sid = 'fghij');
?>

db_delete() mit OR-Bedingung:

<?php
// Aus taxonomy_term_save():
$or = db_or()->condition('tid1', 5)->condition('tid2', 6);
db_delete('term_relation')->condition($or)->execute();
// DELETE FROM {term_relation} WHERE ((tid1 = 5 OR tid2 = 6))
?>