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

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

  1. $result = db_query("INSERT INTO {my_table} (field1, field2, field3, ...)  
  2.                     VALUES ('%s', '%s', %d, ...)",
  3.                     $field1,$field2,$field3,...);
Когда стал работать с Друпалом 6.x, по инерции продолжил пользоваться этим же способом, даже несмотря на то, что был в курсе наличия Schema API и использовал drupal_install_schema().

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

  1. $my_table_entry = new stdClass();
  2. $my_table_entry->field1 = 'field1';
  3. $my_table_entry->field2 = 'field2';
  4. $my_table_entry->field3 = 3;
  5. //...
  6. drupal_write_record('my_table',$my_table_entry);
Казалось бы, предыдущий вариант несколько компактнее. Однако что если мы сделали новый тип нода и реализуем hook_insert()? Тогда запись
  1. function mymodule_insert($node) {
  2.   $result = db_query("INSERT INTO {my_table}  (field1, field2, field3, ...)  
  3.                       VALUES ('%s', '%s', %d, ...)",
  4.                       $node->field1,$node->field2,$node->field3,...);
  5. }
превратится в
  1. function mymodule_insert($node) {
  2.   drupal_write_record('my_table',$node);
  3. }
Аналогичная метаморфоза ожидает и hook_update(), ведь для обновления достаточно только добавить третьим аргументом названия полей primary keys, по которым обновляемая запись будет обнаружена.

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

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

Отправить комментарий

CAPTCHA
Пройдите, пожалуйста, проверку. Она нужна, чтобы отличать людей от спам-роботов. А если не хотите проходить эту проверку регулярно — зарегистрируйтесь.
Image CAPTCHA
Введите цифры, изображенные на картинке (без пробелов).