Измените формат возврата на Выборе PDO PHP

Я пишу свою собственную обертку PDO для создания моей жизни легче и изрядное количество более безопасный.

Стандартный запрос похож:

$user = $db->select('users')
           ->eq('twitter_id', $twitter_id)
           ->limit(1)
           ->prepare()
        ->exec();

Генерирует этот запрос:

SELECT * FROM users WHERE twitter_id = :twitter_id LIMIT 1

Это работает превосходное, поскольку я, в настоящее время, хочу это. То, где я сталкиваюсь с проблемой, - когда у меня есть запрос для возврата нескольких строк.

Мои магазины приложений некоторые динамические настройки, которые я хочу захватить и использовать в одной передаче и я могу сделать это путем выполнения запроса как:

$share_datas = $db->select('settings', 'setting, value')
                  ->prepare()
               ->exec();

Который генерирует:

SELECT setting, value FROM settings

Который возвращается:

Array
(
    [0] => Array
        (
            [setting] => since_id
            [value] => 17124357332
        )

    [1] => Array
        (
            [setting] => last_dm
            [value] => 1271237111
        )
)

Функция prepare() соединяет части для запроса и функции exec() связывает параметрические усилители и возвращает массив.

    function exec()
    {
//      echo 'vars: <pre>'.print_r($this->sql_vars, true).'</pre>';
        $stmt = $this->dbh->prepare($this->sql_last_query); 
        foreach($this->sql_vars as $key => $val)
        {
            if('date_time' === $key) continue;
            $bind = $stmt->bindValue($key, $val);
        }
        $stmt->execute();
        $this->sql_vars = array();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

Теперь к вопросу: Есть ли способ, которым я могу измениться exec() или сам запрос так, чтобы это могло возвратить массив, который возвращается как ниже и избегает каких-либо дополнительных циклов?

Array
(
     [since_id] => 17124357332
     [last_dm]  => 1271237111
)
1
задан Jayrox 27 June 2010 в 01:25
поделиться

2 ответа

Нет проблем с некоторыми простыми функциями массивов.

$in = $db->exec();
$out = array();
foreach( $in as $row )
    $out[ $row['setting'] ] = $row['value'];

Если вам нужна более общая функция, вам придется описать преобразование более четко.

1
ответ дан 2 September 2019 в 23:28
поделиться

Скорее всего, ответ будет либо:

  1. Создание нескольких версий вашего метода exec с другим возвратом поведения, или
  2. имея exec просто выполнить выполнение и сохранить дескриптор оператора, а затем сделать выборку данных отдельным методом.

В дополнение к вашему текущему массиву хэшей мне пригодились следующие удобные методы:

  • Запрос «один»: первый столбец в первой строке как скаляр (для таких вещей, как SELECT COUNT (*))
  • «Список» запроса: первый столбец всех строк в виде индексированного массива (для таких вещей, как SELECT id FROM ...))
  • Запрос «пары»: первые два столбца всех строк в виде хэша (для вашей текущей проблемы)
  • Запрос «вставить идентификатор»: последний сгенерированный идентификатор строки в виде скаляра (автоинкремент в MySQL, последовательность в Postgres и т. Д.)

Это все иногда удобные вещи, которые PDO (и большинство других адаптеров баз данных) просто не имеют встроенных флагов для обработки.

1
ответ дан 2 September 2019 в 23:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: