Как использовать db_merge в Drupal

В Drupal, db_merge представляет собой сочетание Insert запроса и Update запроса. Если в таблице существует запись с заданным первичным ключом, то выполняется Update запрос, если нет - Insert запрос.

Простое слияние

db_merge('example')
  ->key(array('id' => $id))
  ->fields(array(
    'field_1' => $value_1,
    'field_2' => $value_2,
  ))
  ->execute();

В этом примере, мы выполняем запрос на примере таблицы "example". Мы указываем ключевое поле "id" со значением $id (->key(array('id' => $id))). Затем мы указываем массив со значениями полей:

->fields(array(
  'field_1' => $value_1,
  'field_2' => $value_2,
))

Если запись, в которой поле "id" имеет значение $id, уже существует, то фактически будет выполнен Update запрос и в полях "field_1" и "field_2" будут обновлены значения на $value_1 и $value_2 соответственно. Если запись не существует, то будет выполнен Insert запрос, в таблице будет создана новая запись, при этом поле "id" примет значение $id, "field_1" примет значение $value_1, а "field_2" - $value_2. Таким образом, в конце запроса, конечный результат будет тот же, независимо от того, существует запись в таблице или нет.

Слияние с условием

В некоторых случаях, можно установить значения по-разному в зависимости от наличия или отсутствия записи:

db_merge('example')
  ->key(array('id' => $id))
  ->insertFields(array(
    'field_1' => $value_1,
    'field_2' => $value_2,
  ))
  ->updateFields(array(
    'field_1' => $alternate_1,
  ))
  ->execute();

Приведенный выше пример будет вести себя так же, как и предыдущий, за исключением того, что если запись уже существует, то у поля "field_1" значение будет обновлено на $alternate_1, при этом значение поля "field_2" будет не тронуто. Метод updateFields принимает ассоциативный массив. Ключами массива являются названия полей, значениями - значения полей, которые необходимо установить.

Слияние с выражением

db_merge('example')
  ->key(array('id' => $id))
  ->fields(array(
    'field_1' => $value_1,
    'field_2' => $value_2,
  ))
  ->expression('field_1', 'field_1 + :inc', array(':inc' => 1))
  ->execute();

В этом примере, если запись уже существует, то значение у поля "field_1" будет установлено в его текущее значение плюс 1, при этом полю "field_2" будет присвоено значение $value_2 не зависимот от того, существует запись или нет. Метод expression может быть вызван несколько раз, один раз для каждого поля. Так же отмечу, что нет требования, чтобы поле, используемое в методе expression присутствовало в методе fields.

Приоритет

  • Поле, установленное в методе expression имеет приоритет над полем, установленном в методе updateFields;
  • Если запись уже существует и обновления полей указаны в методе updateFields, то обновлены будут только эти поля, остальные поля остануться без изменений.

Комментарии (1)

Аватар пользователя kreaton
kreaton

В закладки! Очень познавательно))