Доктрина DBAL 2: Извлекать() ненужные размеры массива
В доктрине 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
)
Я не смог найти никакой информации о режимах выборки в документации. и я мог бы сделать карту массива. Но это накладные расходы, на мой взгляд..
5 answers
Вы можете передать параметр режима выборки в fetchAll()
.
$stmt->fetchAll(PDO::FETCH_COLUMN)
Этот ответ был отредактирован, потому что Docal прав, и кто-то указал на это в комментарии.
Вы можете использовать режим выборки FETCH_COLUMN для выборки ():
$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;
Как только вы запрашиваете несколько строк в базе данных, это не имеет смысла.
СУБД хранит строки и столбцы, поэтому результат, представленный в виде, к удивлению, строк и столбцов.
В мире программирования это называется матрицей, в мире PHP это array
________________
| id | name |
|______|_________|
| 1 | foo |
|______|_________|
| 2 | bar |
|______|_________|
Приведет к
array(
0 => array(
'id' => 1,
'name' => 'foo',
),
1 => array(
'id' => 2,
'name' => 'foo',
)
);
Так что нет, вы не можете этого сделать , вы предпочли бы обработать результат в соответствии с вашими потребностями.