Schema API и запись данных в Друпале

Так получилось, что еще года четыре назад я немного баловался Друпалом 4.x. Там новые записи добавлялись в таблицы базы данных через db_query(), которая никуда не делась и в шестой версии. Пример добавления записи выглядел так:

$result = db_query("INSERT INTO {my_table} (field1, field2, field3, ...)
                     VALUES ('%s', '%s', %d, ...)",
                    $field1,$field2,$field3,...);

Когда стал работать с Друпалом 6.x, по инерции продолжил пользоваться этим же способом, даже несмотря на то, что был в курсе наличия Schema API и использовал drupal_install_schema().

И только недавно выяснил, что использовать drupal_write_record() — куда изящнее и удобнее.

$my_table_entry = new stdClass();
$my_table_entry->field1 = 'field1';
$my_table_entry->field2 = 'field2';
$my_table_entry->field3 = 3;
//...
drupal_write_record('my_table',$my_table_entry);

Казалось бы, предыдущий вариант несколько компактнее. Однако что если мы сделали новый тип нода и реализуем hook_insert()? Тогда запись

function mymodule_insert($node) {
  $result = db_query("INSERT INTO {my_table}  (field1, field2, field3, ...)
                       VALUES ('%s', '%s', %d, ...)",
                      $node->field1,$node->field2,$node->field3,...);
}

превратится в

function mymodule_insert($node) {
  drupal_write_record('my_table',$node);
}

Аналогичная метаморфоза ожидает и hook_update(), ведь для обновления достаточно только добавить третьим аргументом названия полей primary keys, по которым обновляемая запись будет обнаружена.

Ну и, наконец, по окончании работы функции, в сохраняемом объекте появятся значения всех serial-полей вновь созданной записи, то есть вызывать n-е количество раз db_last_insert_id() будет уже не нужно.

В общем, если в нашем модуле таблицы БД созданы через Schema API (а они должны быть так созданы) — использовать drupal_write_record() очень удобно.

Комментарии