Доктрина 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
)

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

Author: Yolanda van der Vegt, 2012-09-20

5 answers

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

$stmt->fetchAll(PDO::FETCH_COLUMN)
 22
Author: Docal, 2016-08-17 02:23:07

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

Вы можете использовать режим выборки FETCH_COLUMN для выборки ():

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

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

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

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

 8
Author: timdev, 2016-08-17 19:55:39

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

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

Doctrine\ORM\Internal\Hydration
 2
Author: Christian Huber, 2012-09-20 09:58:45

Начиная с 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;
 1
Author: StrayObject, 2015-02-11 10:44:08

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

СУБД хранит строки и столбцы, поэтому результат, представленный в виде, к удивлению, строк и столбцов.

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

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

Приведет к

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

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

 0
Author: Boris Guéry, 2012-09-20 09:46:35