Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

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

02/12/2019, by Ivan

Запросы обновления должны всегда использовать конструктор запросов. Различные БД имееют специфические обработчики для 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 на данный момент.