1. Работа с БД в Drupal 7
Поддерживаемые СУБД
MySQL (> 90% сайтов)
PostgreSQL
SQLite
MSSQL и Oracle (дополнительный модули)
Способы работы с БД
Plain SQL queries
PDO (PHP Data objects)
3. Выполнение запросов SELECT
Plain SQL
$nodes = db_query(
"SELECT nid, title
FROM {node}
WHERE type = :type
AND uid = :uid",
array(':type' => 'page', ':uid' => 1));
PDO
$nodes = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->condition('n.type', 'page')
->condition('n.uid', 1)
->execute();
Обходим полученные записи
foreach ($nodes as $node) {
$items[$node->nid] = $node->title;
}
4. Запрос SELECT
с INNER JOIN, LIMIT и ORDER BY
Plain SQL
$result = db_query(
"SELECT n.title, u.name
FROM {node} n
INNER JOIN {users} u ON n.uid = u.uid
ORDER BY title DESC
LIMIT 0, 10");
PDO
$query = db_select('node', 'n')
->innerJoin('users', 'u', 'n.uid = u.uid')
->fields('n', array('title'))
->fields('u', array('name'))
->orderBy('n.title', 'DESC')
->range(0, 10)
->execute();
5. Запрос SELECT для получение количества записей
Plain SQL
$count = db_query(
"SELECT COUNT(*) FROM {node}")
->fetchField();
PDO вариант 1
$count = db_select('node')
->countQuery()
->execute()
->fetchField();
PDO вариант 2
$count = db_select('node')
->addExpression('COUNT(*)')
->execute()
->fetchField();
6. Запрос SELECT со сложными условиями WHERE
Plain SQL
$nodes = db_query(
"SELECT *
FROM {node}
WHERE title LIKE :title
AND (uid = :uid OR status = :status)",
array(':title' => '%' . db_like('somestring') . '%', ':uid' => 1, ':status' => 0));
PDO
$nodes = db_select('node', 'n')
->fields('n')
->condition('n.title', '%' . db_like('somestring') . '%', 'LIKE')
->condition(
db_or()
->condition('n.uid', 1)
->condition('n.status', 0)
)
->execute();
7. Варианты получения результатов запроса SELECT
по-умолчанию - массив объектов
fetchAllKeyed() - ассоциативный массив
fetchAllAssoc($key) - ассоциативный массив сгрупированный по
указанному полю
fetchCol() - массив значений одной колонки
fetchField() - единичное значение поля
rowCount() - кол-во строк таблицы затронутых запросом
getQueryString() - сформированный SQL-запрос
8. UPDATE — запросы на обновление значений
Plain SQL (не рекомендуется)
db_query(
"UPDATE {node}
SET status = :status
WHERE nid = :nid",
array(':status' => 1, ':nid' => 123));
PDO
db_update('node')
->fields(array('status' => 1))
->condition('nid', 123)
->execute();
10. DELETE — запросы на удаление значений
Plain SQL
db_query(
"DELETE FROM {node}
WHERE uid = :uid AND created < :created",
array(':uid' => 1, ':created' => time() - 3600));
PDO
db_delete('node')
->condition('uid', 1)
->condition('created', time() - 3600, '<')
->execute();
11. Специальные таблицы
Variables — хранение настроек модулей
variable_set($name, $value)
variable_get($name, $default = NULL)
variable_del($name)
Cache, Cache_* — хранение кеша
cache_set($cid, $data, $bin = 'cache', $expire = CACHE_PERMANENT)
cache_get($cid, $bin = 'cache')
Node, User и другие объекты
вставлять, обновлять или удалять нужно только с помощью API
13. Ссылки на подробную информацию
http://api.drupal.org/api/drupal/includes!database!database.inc/
group/database/7
http://drupal.org/developing/api/database
http://xandeadx.ru/blog/drupal/88
http://php.net/pdo