Так получилось, что еще года четыре назад я немного баловался Друпалом 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()
очень удобно.