Ответ 1
Вы можете передать параметр режима выборки в fetchAll()
.
$stmt->fetchAll(\PDO::FETCH_COLUMN)
В доктрине 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
)
Я не мог найти информацию о режимах выборки в документации. и я мог бы сделать карту массива. Но это накладные расходы, на мой взгляд.
Вы можете передать параметр режима выборки в fetchAll()
.
$stmt->fetchAll(\PDO::FETCH_COLUMN)
Этот ответ был отредактирован, потому что Docal прав, и кто-то указал на это в комментарии.
Вы можете использовать fetch-mode FETCH_COLUMN для fetchAll():
$stmt->fetchAll(\PDO::FETCH_COLUMN)
Как указывает пользователь "Ваше общее чувство", fetchAll() может возвращать данные, отформатированные во множестве интересных форматов.
Или вы можете выполнять итерацию с помощью fetchColumn():
while($page_url = $stmt->fetchColumn()) {
echo $page_url . PHP_EOL;
}
Если у вас есть несколько случаев, когда вам нужна эта форма результата, хотя я тоже не понимаю смысла, вы можете реализовать интерфейс AbstractHydrator для создания своего собственного массива ArrayHydrator, который возвращает структуру по мере необходимости.
Классы гидратации находятся в NS:
Doctrine\ORM\Internal\Hydration
С 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;
Как только вы запрашиваете несколько строк в базе данных, это означает не.
RDBMS хранит строки и столбцы, поэтому результат представляется в виде неожиданных строк и столбцов.
В мире программирования он называется матрицей, в мире PHP это array
________________
| id | name |
|______|_________|
| 1 | foo |
|______|_________|
| 2 | bar |
|______|_________|
приведет к
array(
0 => array(
'id' => 1,
'name' => 'foo',
),
1 => array(
'id' => 2,
'name' => 'foo',
)
);
Итак, нет, вы не можете этого сделать, лучше обработать результат в соответствии с вашими потребностями.