Урок - Функция выборки db_select()

Главная » Курсы » Курс Drupal 7, Разработка модулей » Урок - Функция выборки db_select()

Обучающий онлайн курс
Drupal 7, Разработка модулей

Лицензия: Копирование запрещено.

Функция db_select() - предназначена для получения данных из базы данных.

Функция db_select() принимает три аргумента:

db_select($table, $alias = NULL, array $options = array())
  • $table, первый аргумент - имя основной таблицы. Это имя будет указанов в запросе SELECT после FROM.
  • $alias, второй аргумент - синоним основной таблицы. Если синоним указан, то указывается в запросе SELECT в части FROM после имени таблицы.
  • $options, третий аргумент - ассоциативный массив опции для соединения.

Функция db_select() возвращает объект класса SelectQuery.

Рассмотрим несколько примеров.

Получение данных из таблицы материалов (node).

// Запрос: SELECT * FROM {node}
// для Drupal 6 команда была бы такой:
// $result = db_query("SELECT * FROM {node}');
// print_r(db_fetch_object($result));

//	для Drupal 7 вариант 1
$result = db_select('node')->fields('node')->execute();
print_r($result->fetchObject());

//	для Drupal 7 вариант 2
$nodes = db_select('node');
$nodes->fields('node');
$result = $nodes->execute();
print_r($result->fetchObject());

Получение данных из таблицы материалов (node).

// Запрос: SELECT id, title FROM {node}
// для Drupal 6 команда была бы такой:
// $result = db_query("SELECT id, title FROM {node}');
// print_r(db_fetch_object($result));

//	для Drupal 7 вариант 1
$result = db_select('node')->fields('node', array('id', 'title'))->execute();
print_r($result->fetchObject());

//	для Drupal 7 вариант 2
$nodes = db_select('node');
$nodes->fields('node', array('id', 'title')));
$result = $nodes->execute();
print_r($result->fetchObject());

Получение данных из таблицы материалов (node) с условием.

// Запрос: SELECT * FROM {node} WHERE status = 1
// для Drupal 6 команда была бы такой:
// $result = db_query("SELECT * FROM {node} WHERE status = %d', 1);
// print_r(db_fetch_object($result));

//	для Drupal 7 вариант 1
$result = db_select('node')->fields('node')->condition('status', 1)->execute();
print_r($result->fetchObject());

//	для Drupal 7 вариант 2
$nodes = db_select('node');
$nodes
  ->fields('node')
  ->condition('status', 1);
$result = $nodes->execute();
print_r($result->fetchObject());

//	для Drupal 7 вариант 3
$nodes = db_select('node');
$nodes->fields('node');
$nodes->condition('status', 1);
$result = $nodes->execute();
print_r($result->fetchObject());

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

// запрос: SELECT title FROM {node} WHERE nid = 123
// Drupal 6
// $title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", 123));

// Drupal 7, вариант 1
$title = db_select('node', 'n')
  ->fields('n', array('title'))
  ->condition('n.nid', 123)
  ->execute()
  ->fetchField();

Получение данных из нескольких таблиц.

// Запрос: SELECT * FROM {node} n INNER JOIN {users} u ON u.uid = n.uid
// для Drupal 6 команда была бы такой:
// $result = db_query("SELECT * FROM {node} n INNER JOIN {users} u ON u.uid = n.uid');
// print_r(db_fetch_object($result));

//	для Drupal 7 вариант 1
$result = db_select('node')
  ->fields('node')
  ->innerJoin('users', 'u', 'u.uid = n.uid')
  ->execute();
print_r($result->fetchObject());

//	для Drupal 7 вариант 2
$nodes = db_select('node');
$nodes
  ->fields('node')
  ->innerJoin('users', 'u', 'u.uid = n.uid');
$result = $nodes->execute();
print_r($result->fetchObject());

//	для Drupal 7 вариант 3
$nodes = db_select('node');
$nodes->fields('node');
$nodes->innerJoin('users', 'u', 'u.uid = n.uid');
$result = $nodes->execute();
print_r($result->fetchObject());

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

// запрос: SELECT COUNT(*) FROM {node}
// Drupal 6
// $count = db_result(db_query("SELECT COUNT(*) FROM {node}"));

// Drupal 7, вариант 1
$count = db_select('node')
  ->countQuery()
  ->execute()
  ->fetchField();

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

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

// запрос: SELECT * FROM {node} LIMIT 0, 10
// Drupal 6
// $result = db_query_range("SELECT * FROM {node}", 0, 10);
 
// Drupal 7
$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(); 
foreach ($nodes as $node) {
  $items[] = $node->title;
}

Сортировка

// запрос: SELECT * FROM {node} ORDER BY created DESC, title ASC
// Drupal 6
// $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();
((комментарий))