Drupal 7: Verwendung von db_merge()

Autor: Sven am Mon, 25.05.2015 - 09:19

Wer kennt das Problem nicht: Daten in eine Datenbank speichern, vorher prüfen ob der Eintrag existiert, wenn nicht in die Datenbank einfügen ansonsten ein Update auf dem bereits bestehenden Eintrag ausführen.

Meist existiert ein Formular in dieser Form:

// The form
function example_my_form($form, &$form_state, $entry = NULL) {
  $form = array();
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => t('Title'),
    '#default_value' => isset($entry->title) ? $entry->title : '',
  );

  // Other fields

  $form['id'] = array(
    '#type' => 'value',
    '#value' => isset($entry->id) ? $entry->id ? $entry->id : NULL,
  );

  // Submit button, ...
}

Der Code dazu würde dann folgendermaßen aussehen:

// Submit handler
function example_my_form_submit($form, &$form_state) {
  if ($exists) {
    // Execute db_update()
  } else {
    // Execute db_insert()
  }
}

Seit Drupal 7 existiert eine neue Funktion db_merge(), die genau dieses "Problem" aus der Welt schafft und beide Funktionen einfach kombiniert, was dann folgendermaßen aussehen würde:

function example_my_form_submit($form, &$form_state) {
  $fields = array('title' => $form_state['values']['title']);
  db_merge('table')->key('id' => $id)->fields($fields)->execute();
}

Wichtig ist hier die $id Variable, die den Primärschlüssel definiert nach dem in der Tabelle der Datenbank gesucht wird. Wird dieser gefunden wird ein Update auf den Feldern ($fields) ausgeführt, ansonsten wird ein neuer Eintrag in der Tabelle angelegt. Bitte die Platzhalter durch die realen Werte ersetzen

Fragen wie immer in den Kommentaren.