---
title: 'Schema API и запись данных в Друпале'
url: 'https://graker.ru/news/2009/10/30/schema_api_i_zapis_dannykh_v_drupale'
language: ru
type: post
author: 'Роман Грачев'
published: '2009-10-30T15:33:55+03:00'
updated: '2016-08-11T16:43:55+03:00'
categories:
  - Программирование
  - Друпальчики
---

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

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

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

Когда стал работать с Друпалом 6.x, по инерции продолжил пользоваться этим же способом, даже несмотря на то, что был в курсе наличия [Schema API](http://drupal.org/node/146843) и использовал `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()`](http://api.drupal.org/api/function/hook_insert/6)? Тогда запись

```
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()`](http://api.drupal.org/api/function/hook_update/6), ведь для обновления достаточно только добавить третьим аргументом названия полей primary keys, по которым обновляемая запись будет обнаружена.

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

В общем, если в нашем модуле таблицы БД созданы через [Schema API](http://drupal.org/node/146843) (а они должны быть так созданы) — использовать `drupal_write_record()` очень удобно.
