MySQL Datenbanken mit Drupal7 ansprechen

Mo, 26.03.2012 - 16:49 -- admin

Drupal7 bietet einen PDO ähnliche Datenbank Schnittstelle, diese ist auch recht gut Dokumentiert unter Database API. Ein paar Funktionen und Abteilungen kann man allerdings nicht direkt ableiten, deswegen eine kurze Sammlung.
Jede SQL Query lässt sich auch an andere Datenbanken verteilen (z.B. Master / Slave), dazu gibt es einen zusätzlichen Parameter: Drupal7: Datenbank einbinden und nutzen über API.

LIKE Abfragen

LIKE Statements können über normale Conditions abgebildet werden.

$query = db_select('your_table');
$query->fields('your_table', array('name', 'street'));
$query->condition('name', '%' . $your_search .  '%', 'LIKE');
$query->execute()->fetchAll();    

Zähler in Update Statement

Einen einfachen Zähler zum Beispiel für Downloads kann man auch dynmaisch generieren.

$query = db_update('table');
$query->expression('downloads', 'downloads + 1');
#$query->expression('downloads', 'downloads + :downloads', array(':downloads' => 1));
$query->condition('id', 'xyz');
$query->execute();

BETWEEN und WHERE

Sollten sich manche Abfrage nicht direkt dynamisch zusammenbauen lassen, kann man auch einfach direktes SQL nutzen.

$query = db_select('table')->fields('table', array('kennung', 'bezirkskennung'));
$query->condition('normalizestreet', '%' . $nstreet . '%', 'LIKE')
      ->where($firstnr . " BETWEEN table.number_from AND table.number_top");

Zusätzliche kleine Funktionen

Einige Funtionen, die meiner Meinung noch in der Klasse SelectQuery von Drupal fehlen, leider lässt sich diese nur über externe Funktionen erweitern.

/**
 * Generate a DatabaseCondition on key-value array
 * 
 * @param array $fields
 *  key value fields
 * 
 * @return DatabaseCondition 
 */
function db_conditions_and($fields) {
 
  $h = db_and();
  foreach ($fields as $key => $value) {
    $h->condition($key, $value);
  }
 
  return $h;
}
 
/**
 * Add conditions by a query reference on key-value array
 * 
 * @param SelectQuery $query
 * @param array $fields 
 *   key value fields
 */
function db_conditions(SelectQuery &$query, $fields) {
 
  $h = db_and();
  foreach ($fields as $key => $value) {
    $h->condition($key, $value);
  }
 
  $query->condition($h);
}
 
/**
 * Drupal SelectQuery needs fields method to work; wrapper to add select all
 * 
 * 
 * @param string $table
 *  The Database table to query
 * @param array $fields
 *  Field so select; default all
 * @return SelectQuery
 */
function db_select_all($table, $fields = array()) {
  return db_select($table)->fields($table, $fields);
}
 
/**
 * Add an or statemate on multiple fields; key-value based
 *
 * @param SelectQuery $query
 * @param array $fields 
 */
function db_conditions_or(SelectQuery &$query, $fields) {
 
  $h = db_or();
  foreach ($fields as $key => $value) {
    $h->condition($key, $value);
  }
 
  $query->condition($h);
}