В 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, то обновлены будут только эти поля, остальные поля остануться без изменений.