Работа с базой данных в Drupal 7

Выборка с условием:

// Drupal 6
$nodes = db_query("SELECT nid, title FROM {node} WHERE type = '%s' AND uid = %d", 'page', 1);

// Drupal 7, вариант 1
$nodes = db_query("SELECT nid, title FROM {node} WHERE type = :type AND uid = :uid", array(':type' => 'page', ':uid' => 1));

// Drupal 7, вариант 2 (более правильный)
$nodes = db_select('node', 'n')
  ->fields('n', array('nid', 'title'))
  ->condition('n.type', 'page')
  ->condition('n.uid', 1)
  ->execute();

Выборка из двух таблиц соединённых с помощью INNER JOIN:

// Drupal 6, Drupal 7
$result = db_query("SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid");

// Drupal 7, вариант 2 (более правильный)
$query = db_select('node', 'n');
$query->innerJoin('users', 'u', 'n.uid = u.uid');
$query->fields('n', array('title'));
$query->fields('u', array('name'));
$result = $query->execute();

Получить значение поля у единственной записи:

// Drupal 6
$title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", 123));

// Drupal 7, вариант 1
$title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchField();

// Drupal 7, вариант 2 (более правильный)
$title = db_select('node', 'n')
  ->fields('n', array('title'))
  ->condition('n.nid', 123)
  ->execute()
  ->fetchField();

Получить объект по его id:

// Drupal 6
$node = db_fetch_object(db_query("SELECT * FROM {node} WHERE nid = %d", 123));

// Drupal 7, вариант 1
$node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => 123))->fetchObject();

// Drupal 7, вариант 2 (более правильный)
$node = db_select('node', 'n')
  ->fields('n')
  ->condition('n.nid', 123)
  ->execute()
  ->fetchObject();

Посчитать число записей:

// Drupal 6
$count = db_result(db_query("SELECT COUNT(*) FROM {node}"));

// Drupal 7, вариант 1
$count = db_query("SELECT COUNT(*) FROM {node}")->fetchField();

// Drupal 7, вариант 2 (более правильный)
$count = db_select('node')
  ->countQuery()
  ->execute()
  ->fetchField();

// Drupal 7, вариант 3
$query = db_select('node');
$query->addExpression('COUNT(*)');
$count = $query->execute()->fetchField();

Выбрать определённое количество записей:

// Drupal 6, Drupal 7
$result = db_query("SELECT * FROM {node} LIMIT 0, 10");

// Drupal 7, вариант 2 (более правильный)
$result = db_select('node')->range(0, 10)->execute();

Обойти записи:

// Drupal 6
$nodes = db_query("SELECT * FROM {node}");
while ($node = db_fetch_object($nodes)) {
  $items[] = $node->title;
}

// Drupal 7
$nodes = db_select('node', 'n')->fields('n')->execute(); // или $nodes = db_query("SELECT * FROM {node}");
foreach ($nodes as $node) {
  $items[] = $node->title;
}

Обновление записи:

// Drupal 6
db_query("UPDATE {node} SET status = %d WHERE nid = %d", 1, 123);

// Drupal 7, вариант 1
db_query("UPDATE {node} SET status = :status WHERE nid = :nid", array(':status' => 1, ':nid' => 123));

// Drupal 7, вариант 2 (более правильный)
db_update('node')
  ->fields(array('status' => 1))
  ->condition('nid', 123)
  ->execute();

Удаление записи:

// Drupal 6
db_query("DELETE FROM {node} WHERE uid = %d AND created < %d", 1, time() - 3600);

// Drupal 7, вариант 1
db_query("DELETE FROM {node} WHERE uid = :uid AND created < :created", array(':uid' => 1, ':created' => time() - 3600));

// Drupal 7, вариант 2 (более правильный)
db_delete('node')
  ->condition('uid', 1)
  ->condition('created', time() - 3600, '<')
  ->execute();

Добавление записи:

// Drupal 6
db_query("INSERT INTO {mytable} (intvar, stringvar, floatvar) VALUES (%d, '%s', %f)", 5, 'hello world', 3.14);
$id = db_last_insert_id();

// Drupal 7
$id = db_insert('mytable')
  ->fields(array('intvar' => 5, 'stringvar' => 'hello world', 'floatvar' => 3.14))
  ->execute();

Для добавления данных можно по прежнему пользоваться drupal_write_record()

Использование логического оператора OR в условии:

// Drupal 6
$nodes = db_query("SELECT * FROM {node} WHERE uid = %d OR status = %d", 1, 0);

// Drupal 7, вариант 1
$nodes = db_query("SELECT * FROM {node} WHERE uid = :uid OR status = :status", array(':uid' => 1, ':status' => 0));

// Drupal 7, вариант 2 (более правильный)
$nodes = db_select('node', 'n')
  ->fields('n')
  ->condition(
    db_or()
      ->condition('uid', 1)
      ->condition('status', 0)
  )
  ->execute();

Использование оператора IN в условии:

$nids = array(1, 2, 3);

// Drupal 6
$nodes = db_query("SELECT * FROM {node} WHERE nid IN (" . db_placeholders($nids) . ")", $nids);

// Drupal 7, вариант 1
$nodes = db_query("SELECT * FROM {node} WHERE nid IN (:nids)", array(':nids' => $nids));

// Drupal 7, вариант 2 (более правильный)
$nodes = db_select('node', 'n')
  ->fields('n')
  ->condition('n.nid', $nids, 'IN')
  ->execute();

Сложные условия в WHERE:

// Drupal 6, Drupal 7
$nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = %d", 2011);

// Drupal 7, вариант 1
$nodes = db_query("SELECT * FROM {node} WHERE YEAR(FROM_UNIXTIME(created)) = :created", array(':created' => 2011));

// Drupal 7, вариант 2 (более правильный)
$nodes = db_select('node', 'n')
  ->fields('n')
  ->where('YEAR(FROM_UNIXTIME(created)) = :created', array(':created' => 2011))
  ->execute();

Сортировка

// Drupal 6, Drupal 7
$nodes = db_query("SELECT * FROM {node} ORDER BY created DESC, title ASC");

// Drupal 7, вариант 2 (более правильный)
$nodes = db_select('node', 'n')
  ->fields('n')
  ->orderBy('n.created', 'DESC')
  ->orderBy('n.title', 'ASC')
  ->execute();

Получить одну колонку из таблицы в виде массива:

// Drupal 6
$result = db_query("SELECT nid FROM {node}");
$nids = array();
while ($row = db_fetch_object($result)) {
  $nids[] = $row->nid;
}

// Drupal 7, вариант 1
$nids = db_query("SELECT nid FROM {node}")->fetchCol();

// Drupal 7, вариант 2 (более правильный)
$nids = db_select('node', 'n')
  ->fields('n', array('nid'))
  ->execute()
  ->fetchCol();

Получить одну колонку из таблицы в виде массива, в котором ключами массива будет первое поле в запросе:

// Drupal 6
$result = db_query("SELECT nid, title FROM {node}");
$nodes = array();
while ($row = db_fetch_object($result)) {
  $nodes[$row->nid] = $row->title;
}

// Drupal 7, вариант 1
$nodes = db_query("SELECT nid, title FROM {node}")->fetchAllKeyed(0, 1);

// Drupal 7, вариант 2 (более правильный)
$nodes = db_select('node', 'n')
  ->fields('n', array('nid', 'title'))
  ->execute()
  ->fetchAllKeyed(0, 1);

Полный мануал с кучей примеров есть на официальном сайте — Database API.

Добавлено 09/07/2011

Работа с базой данных в Drupal 7
Tagged on:                 

Добавить комментарий