ertttert
Books-CMS.clan.su

Выборка результатов запроса

Существует несколько способов выборки результатов запросов в зависимости от того, нужна одна строка или же набор результатов, диапазон результатов для внутреннего использования либо для отображения с разбивкой на страницы.

Получение одного значения

Если требуется получить из базы данных только одно значение, можно применять метод ->fetchField(), который позволяет выбрать это значение. Вот пример выборки общего количества записей в таблице joke:

$nbr_records = db_query("SELECT count(nid) FROM {joke}")->fetchField();

Получение нескольких строк

В большинстве случаев из базы данных необходимо возвращать более одного поля. Вот типичный образец перебора строк в наборе результатов:

$type = 'page';
$status = 1;
$result = db_query(
 "SELECT nid, title FROM {node} WHERE type = :type AND status = :status",
 array(
 ':type' => $type, ':status' => 1,
  )
);
foreach ($result as $row) {
echo $row->title."<br/>";
}

Этот фрагмент кода выводит заголовки всех опубликованных нод, имеющих тип page (поле status в таблице node равно 0 для неопубликованных нод и 1 для опубликованных). Вызов db_query возвращает массив результатов, где каждый элемент представляет собой строку из таблицы, удовлетворяющую критерию, который указан в запросе. Цикл foreach позволяет перебрать элементы массива результатов и, как в данном случае, вывести заголовок каждой ноды в отдельной строке.

Использование конструктора запросов и объектов запросов

Одним из нововведений, появившихся в Drupal 7, является возможность построения объектов запросов с помощью конструктора запросов. В приведенных выше примерах запросы были относительно просты, но если понадобится написать более сложные запросы? И вот здесь может пригодиться конструктор запросов и объекты запросов. Сейчас мы рассмотрим один пример, а затем будет описана концепция на основе создания более сложных запросов. В одном из приведенных выше примеров создавался запрос, который выбирал значения из таблицы, если идентификатор роли был больше или равен 2. Запрос имел следующий вид:

$result = db_query('SELECT name FROM {role} WHERE rid = :rid', array(':rid' => 2));

Теперь напишем этот же запрос с помощью объекта запроса и конструктора запросов. Вначале создадим объект запроса — для этого потребуется выбрать нужную таблицу и назначить ей идентификатор (r), чтобы в дальнейшем ссылаться на поля из этой таблицы:

$query = db_select('role', 'r');

Затем расширим запрос, указав условие (rid = 2) и поля для возврата из запроса:

$query
->condition('rid', 2)
->fields('r', array('name'));

После этого можно выполнить запрос и присвоить набор результатов переменной $result:

$result = $query->execute();

Для вывода результатов необходимо пройти в цикле по элементам возвращенного массива:

foreach($result as $row) {
echo $row->name."<br/>";
}

Использование объекта запроса и конструктора запросов облегчает создание сложных запросов к базам данных. В следующих примерах будет показано, как работать с конструктором запросов.

Получение ограниченного диапазона результатов

Выполнение запросов, которые могут вернуть сотни или даже тысячи записей — это риск, который стоит обдумать еще на этапе написания запроса. Один из механизмов минимизации риска — использование модификатора диапазона, который позволяет ограничить максимальное количество записей, возвращаемых запросом. Примером может служить запрос, который возвращает все ноды типа page. Если сайт содержит тысячи нод, запрос может выполняться длительное время и выдать огромный объем информации. С помощью модификатора диапазона можно ограничить количество строк, возвращаемых запросом, и устранить риск длительного выполнения и большого объема данных. Следующий запрос добавляет модификатор диапазона с начальным номером записи 0 и конечным номером 100:

$query = db_select('node', 'n');

$query
 ->condition('type', 'page')
 ->fields('n', array('title'))
 ->range(0,100);

$result = $query->execute();

foreach($result as $row) {
 echo $row->title."<br/>";
}

Получение результатов для страничного вывода

Если запрос возвращает большое количество строк, можно воспользоваться разбивкой на страницы. Такая разбивка ограничивает количество строк, выводимых на одной странице, и обеспечивает навигационный элемент, который позволяет посетителю сайта перемещаться по страницам результатов. Примером может служить запрос, возвращающий 100 строк. Этот запрос можно настроить так, чтобы он выдавал по 10 строк и отображал кнопки Вперед для просмотра следующих 10 строк, Назад для просмотра предыдущих 10 строк, В начало для просмотра первых 10 строк и В конец для просмотра последних 10 строк, а также ссылки для щелчка на конкретном номере страницы и перехода на эту страницу результатов (например, щелчок на ссылке 5 приведет к просмотру строк 41–50).

Для демонстрации разбивки на страницы мы создадим запрос, который возвращает все страничные ноды в таблице нод и выводит результаты порциями по 10 строк на странице с панелью пейджера в нижней части. Вначале мы создадим объект запроса и расширим его, указав Drupal создать объект запроса с пейджером:

$query = db_select('node', 'n')->extend('PagerDefault');

Потом с помощью модификатора-ограничителя добавим условие, поля и количество элементов, которые нужно выводить на странице:

$query
 ->condition('type', 'page')
 ->fields('n', array('title'))
 ->limit(10);

Затем выполним запрос и просмотрим набор результатов, добавляя каждую строку в выходную переменную с удобным именем $output:

$output = '';
foreach ($result as $row) {
 $output .= $row->title."<br/>";
}

После этого вызовем функцию применения к полученным данным темы с пейджером — тогда выходные данные будут выводиться по 10 элементов на странице с пейджером в нижней части этой страницы (рис. 5.2) — и отобразим результаты. Подробное описание, как пейджер работает с результатами запроса к базе данных и как уровень темы отображает постраничные результаты, можно прочитать в файле /includes/pager.inc.

 

$output .= theme('pager');
print $output;

 

Другие распространенные запросы

Уровень баз данных Drupal 7 способен выполнять ряд других распространенных функций, которые могут потребоваться. Первый пример — сортировка набора результатов с помощью метода orderBy. В приведенном ниже примере набор результатов упорядочивается по возрастанию заголовков:

$query
 ->condition('type', 'page')
 ->fields('n', array('title'))
 ->orderBy('title', 'ASC');

Следующий пример выполняет сортировку по-другому — сначала по дате изменения ноды в убывающем порядке, а затем по заголовкам в порядке возрастания:

$query
 ->condition('type', 'page')
 ->fields('n', array('title', 'changed'))
 ->orderBy('changed', 'DESC')
 ->orderBy('title', 'ASC');

Могут существовать и запросы, приводящие к появлению повторяющихся результатов. В таком случае можно отфильтровать такие записи с помощью метода distinct:

$query
 ->condition('type', 'page')
 ->fields('n', array('title', 'changed'))
 ->orderBy('changed', 'DESC')
 ->orderBy('title', 'ASC')
 ->distinct();

Дополнительную информацию и примеры можно найти на странице http://drupal.org/node/310069.

Всего комментариев: 0
Имя *:
Email *:
Код *:


Бесплатный конструктор сайтов - uCoz