Можно ли преобразовать результат Drupal db_query в массив PHP?
В Drupal я могу выполнить SQL следующим образом:
$query_object = db_query("SELECT * FROM {nodes}");
Если я знаю, что запрос возвращает только один результат (так что только 1 строка и 1 столбец), я могу напрямую извлечь его с помощью:
$result = db_result($query_object);
Если у меня есть несколько результатов, мне нужно пропустить их через что-то вроде:
$rows[] = array();
while (($row = db_fetch_object($query_object) != FALSE) {
$rows[] = $row;
}
Мне интересно, есть ли более простой способ сделать это? Есть ли способ передать все результаты в массив с одним выражением? Или это не работает, потому что db_result возвращает объект, похожий на курсор, где вы можете получать только одну строку каждый раз?
Ответы
Ответ 1
Не в Drupal 6.
В Drupal 7 есть методы выборки, которые могут помочь избежать подобных циклов. Из http://drupal.org/node/310072:
<?php
// Retrieve all records into an indexed array of stdClass objects.
$result->fetchAll();
// Retrieve all records into an associative array keyed by the field in the result specified.
$result->fetchAllAssoc($field);
// Retrieve a 2-column result set as an associative array of field 1 => field 2.
$result->fetchAllKeyed();
// You can also specify which two fields to use by specifying the column numbers for each field
$result->fetchAllKeyed(0,2); // would be field 0 => field 2
$result->fetchAllKeyed(1,0); // would be field 1 => field 0
// Retrieve a 1-column result set as one single array.
$result->fetchCol();
// Column number can be specified otherwise defaults to first column
$result->fetchCol($column_index);
?>
Ответ 2
В Drupal 7 вы также можете использовать:
db_query('QUERY')->fetchAll(PDO::FETCH_ASSOC);
Ответ 3
Я всегда что-то вроде этого (просто пример):
$query = db_query("SELECT nid
FROM {from}
WHERE blallala
",
$tab_arg
);
if ($query->rowCount() == 0) {
$output=t('no result')
} else
{
foreach($query as $result)
{
$tab_res[]=$result;
}
foreach($tab_res as $res)
{
$output.=$res->nid;
}
}
Ответ 4
Можно также использовать db_fetch_array($result)
, где $result =
db_query($queryString)
. Как объяснено в документации Drupal:
[Он возвращает]... ассоциативный массив, представляющий следующую строку результата, или ЛОЖНЫЙ. Ключами этого объекта являются имена полей таблицы выбранных по запросу, а значениями являются значения полей для этого строка результата.