Работа с БД в Drupal 7 - урок 9 - Запросы обновления (UPDATE)

Запросы обновления (UPDATE)

Запросы обновления должны всегда использовать конструктор запросов. Различные БД имееют специфические обработчики для LOB (Large OBject, такие как TEXT в MySQL) и поля BLOB (Binary Large OBject), так что уровень абстракции требуется для индивидуальных драйверов для реализации специфических обработчиков.

Запросы обновления должны начинаться с функции db_update():

<?php
$query = db_update('node', $options);
?>

Создавая этот объект-запрос обновления мы будем изменять одну или более записей в таблице node. Заметьте что фигурные скобки не требуются, конструктор запросов сам обрабатывает имена таблиц.

Объект-запрос на обновление использует fluent API. Так что все методы (за исключением execute()) возвращают объект-запрос на себя позволяя вызывать метод сцепления. Во многих случаях это значит что запрос не будет сохранен как переменная.

Запросы на обновления просты и состоят из набора ключа/значения установленные с набором условий WHERE. Полная структуру WHERE мы детально разберем в одном из следующих уроков и только затронем в этом.

Типичный запрос обновления ниже:

<?php
/* Этот ужасный пример показывает как обновить записи в таблице node */
$num_updated = db_update('node')
  ->fields(array(
    'uid' => 5,
    'status' => 1,
  ))
  ->condition('created', REQUEST_TIME - 3600, '>=')
  ->execute();
?>

Указанный пример эквивалентен следующему запросу:

UPDATE {node} SET uid=5, status=1 WHERE created >= 1221717405;

Пример выше будет обновлять все записи в таблице node созданные за последний час и установит их uid равное 5 и поле status равное 1. Метод fields() принимает один ассоциативный массив, который описывает какие поля нужно обновить и какие новые значения нужно вставлять. Заметьте что в отличие от запросов вставки UpdateQuery::fields() поддерживают только ассоциативные массивы. Также порядок в fields в массиве и порядок в каждом вызываемом методе не имеет значение.

Метод execute() будет возвращать число обновленных запросом строк. Заметьте что обновленных не значит все подходящие под условия WHERE. Если например уже есть ноды со значениями uid=5 и status=1, то они могут подходит под условие WHERE, но они не будут изменены, потому что значения совпадают со значениями в запросе. Поэтому запросы на обновления не всегда правдиво отображают сколько строк с uid=5, status=1 на данный момент.

Добавить комментарий

Войти, используя Loginza Google Account Yandex Mail.ru Vkontakte Facebook

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.