Можно ли преобразовать результат 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:

[Он возвращает]... ассоциативный массив, представляющий следующую строку результата, или ЛОЖНЫЙ. Ключами этого объекта являются имена полей таблицы выбранных по запросу, а значениями являются значения полей для этого строка результата.