Doctrine DBAL 2: fetchAll() ненужные размеры массива

В доктрине DBAL2, когда я выполняю такой запрос:

<?php
$connection = $this->getDatabaseConnection();

$sql =  "SELECT page_url
           FROM cms_user_page
          WHERE site_id = :siteid
            AND active = '1'
    ";

$stmt = $connection->prepare($sql);
$stmt->bindValue("siteid", $id);
$stmt->execute(); 

return $stmt->fetchAll();
?>

Я получаю такой результат:

Array
(
    [0] => Array
        (
            [page_url] => index.php?action=login
        )

    [1] => Array
        (
            [page_url] => index.php?action=shoppingcart
        )

    [2] => Array
        (
            [page_url] => index.php?action=products
        )
)

Мой вопрос: есть ли режим выборки, который дает такой результат:

Array
(
    [0] => index.php?action=login

    [1] => index.php?action=shoppingcart

    [2] => index.php?action=products
)

Я не мог найти информацию о режимах выборки в документации. и я мог бы сделать карту массива. Но это накладные расходы, на мой взгляд.

Ответ 1

Вы можете передать параметр режима выборки в fetchAll().

$stmt->fetchAll(\PDO::FETCH_COLUMN)

Ответ 2

Этот ответ был отредактирован, потому что Docal прав, и кто-то указал на это в комментарии.

Вы можете использовать fetch-mode FETCH_COLUMN для fetchAll():

$stmt->fetchAll(\PDO::FETCH_COLUMN)

Как указывает пользователь "Ваше общее чувство", fetchAll() может возвращать данные, отформатированные во множестве интересных форматов.

Или вы можете выполнять итерацию с помощью fetchColumn():

while($page_url = $stmt->fetchColumn()) { echo $page_url . PHP_EOL; }

Ответ 3

Если у вас есть несколько случаев, когда вам нужна эта форма результата, хотя я тоже не понимаю смысла, вы можете реализовать интерфейс AbstractHydrator для создания своего собственного массива ArrayHydrator, который возвращает структуру по мере необходимости.

Классы гидратации находятся в NS:

Doctrine\ORM\Internal\Hydration

Ответ 4

С PHP5.5 вы можете использовать aray_column для достижения требуемого результата:

<?php
$connection = $this->getDatabaseConnection();

$sql =  "SELECT page_url
           FROM cms_user_page
          WHERE site_id = :siteid
            AND active = '1'
    ";

$stmt = $connection->prepare($sql);
$stmt->bindValue("siteid", $id);
$stmt->execute(); 
$data = array_column($stmt->fetchAll(), 'page_url');

return $data;

Ответ 5

Как только вы запрашиваете несколько строк в базе данных, это означает не.

RDBMS хранит строки и столбцы, поэтому результат представляется в виде неожиданных строк и столбцов.

В мире программирования он называется матрицей, в мире PHP это array

 ________________
| id   |   name  |
|______|_________|
| 1    |   foo   |
|______|_________|
| 2    |   bar   |
|______|_________|

приведет к

array(
  0 => array(
     'id'   => 1,
     'name' => 'foo',
  ),
  1 => array(
     'id'   => 2,
     'name' => 'foo',
  )
);

Итак, нет, вы не можете этого сделать, лучше обработать результат в соответствии с вашими потребностями.