Подтвердить что ты не робот

Использование значения столбца как индекса в результатах с использованием PDO

У меня есть таблица SQL, называемая "бренды" с идентификаторами столбцов, именем, URL-адресом. В этой таблице у меня есть этот набор данных:

1, Solidfloor, solidfloor;
2, Quickstep, quickstep;
4, Cleanfloor, cleanfloor;
5, Blue Dolphin, blue-dolphin;
6, Krono, krono;
8, Meister, meister;

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

4b9b3361

Ответ 1

Получить в качестве ассоциированного

Для руководства: http://php.net/manual/en/pdostatement.fetchall.php

fetch_style

Управляет содержимым возвращенного массива, как описано в PDOStatement:: fetch(). Значение по умолчанию для PDO:: ATTR_DEFAULT_FETCH_MODE (которое по умолчанию относится к PDO:: FETCH_BOTH)

Чтобы вернуть массив, состоящий из всех значений одного столбца из набора результатов, укажите PDO:: FETCH_COLUMN. Вы можете указать, какой столбец вы хотите с параметром index-index.

Чтобы получить только уникальные значения одного столбца из набора результатов, побитовое ИЛИ PDO:: FETCH_COLUMN с PDO:: FETCH_UNIQUE.

Чтобы вернуть ассоциативный массив, сгруппированный по значениям указанного столбца, побитовое ИЛИ PDO:: FETCH_COLUMN с PDO:: FETCH_GROUP.

Этот последний бит является ключевым. Он, похоже, не полностью документирован (что я мог найти), но вместо PDO:: FETCH_COLUMN вы можете комбинировать PDO:: FETCH_ASSOC с PDO:: FETCH_GROUP для достижения желаемого результата:

$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP)

Итак, учитывая приведенные выше данные:

$stmt = $PDO_obj->prepare('select * from brands');
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
d($result);

Результаты в:

array (6) [
    '1' => array (1) [
        array (2) [
            'name' => string (10) "Solidfloor"
            'url' => string (10) "solidfloor"
        ]
    ]
    '2' => array (1) [
        array (2) [
            'name' => string (9) "Quickstep"
            'url' => string (9) "quickstep"
        ]
    ]
    '4' => array (1) [
        array (2) [
            'name' => string (10) "Cleanfloor"
            'url' => string (10) "cleanfloor"
        ]
    ]
    '5' => array (1) [
        array (2) [
            'name' => string (12) "Blue Dolphin"
            'url' => string (12) "blue-dolphin"
        ]
    ]
    '6' => array (1) [
        array (2) [
            'name' => string (5) "Krono"
            'url' => string (5) "krono"
        ]
    ]
    '8' => array (1) [
        array (2) [
            'name' => string (7) "Meister"
            'url' => string (7) "meister"
        ]
    ]
]

(d() - это просто удобная функция отладки из библиотеки kint, например var_dump() или print_r())

Обратите внимание, что столбец, используемый для индексации массива, всегда будет первым столбцом в результатах, поэтому вы можете изменить свой оператор выбора, чтобы выбрать нужный столбец. Также обратите внимание, что индексированный столбец будет удален из каждого массива строк; чтобы обойти это, вы можете дважды добавить столбец в оператор select (т.е. select id, brands.* from brands и т.д.).

Здесь указано больше параметров: http://php.net/manual/en/pdostatement.fetch.php, например PDO:: FETCH_UNIQUE, чтобы каждый индекс использовался только один раз.

Ответ 2

Хотя описание PDO::FETCH_UNIQUE в руководстве по PHP довольно неясно, но на самом деле это точный параметр, который вам действительно нужен.

$data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE);

дает вам массив, проиндексированный сначала полем, указанным в предложении SELECT (когда * используется тогда первое поле в определении таблицы, которое должно быть id в вашем случае).

Обратите внимание, что по умолчанию, используя только PDO::FETCH_UNIQUE, вы получите результирующие строки с удвоенными значениями. Вы можете либо добавить предпочтительный режим строки к этому вызову, либо - лучше, установите его один раз для всех вызовов PDO в конструкторе или через setAttribute(). Вывод ниже показан для PDO::FETCH_ASSOC, заданного как режим выборки по умолчанию.

  1 => array (
    'name' => 'Solidfloor',
    'url' => 'solidfloor',
  ),
  2 => array (
    'name' => 'Quickstep',
    'url' => 'quickstep',
  ),
  4 => array (
    'name' => 'Cleanfloor',
    'url' => 'cleanfloor',
  ),
)