Pull to refresh

DB_Pgsql_Type: прозрачное преобразование сложных типов PostgreSQL в PHP и обратно

Reading time 2 min
Views 3.1K
DB_Pgsql_Type — это фреймворк для преобразования сложных типов PostgreSQL 8.3+ в их аналоги на PHP и обратно. С ее помощью вы можете работать с полями сложного типа (к примеру, двумерным массивом композитных типов) так же просто, как с привычными массивами PHP.

Поддерживаются следующие типы данных и любые их вложенные комбинации:
  • Массивы элементов произвольного типа (в том числе многомерные).
  • Композитные типы и ROWTYPE (в частности, сами содержащие композитные поля или поля-массивы).
  • Hstore (в том числе содержащие сложные элементы).
  • Прочие типы: TIMESTAMP (преобразуется в Unix time), DATE, TIME, BOOLEAN и т. д.
PostgreSQL славится своей поддержкой сложных типов данных. Например, вы можете определить столбец некоторой таблицы как двумерный массив строк:

CREATE TABLE something(
  id INTEGER,
  matrix TEXT[][]
);
INSERT INTO something(id, matrix) VALUES(
  1, ARRAY[ARRAY['one','two'], ARRAY['three "3"','four']]
);

Однако в PHP-скрипте при попытке получить значение из такого столбца:

$rs = $pdo->query("SELECT matrix FROM something WHERE id=1");
echo $rs->fetchColumn();

вы увидите лишь строковое представление этих данных, нечто вроде:

{{one,two},{"three \"3\"",four}}

DB_Pgsql_Type как раз и позволяет преобразовать выражения вида {{one,two},{«three \»3\"",four}} в двумерный массив PHP (с учетом особенностей квотинга спец-последовательностей: кавычек, апострофов, пустых строк, NULL и т. д.) Или обратно, если нужно записать двумерный массив в БД.

Исходники библиотеки и документацию можно посмотреть тут:
dklab.ru/lib/DB_Pgsql_Type

Здесь же в качестве простейшего примера приведем код для разбора двумерного массива строк из листинга выше:

// Создаем парсер для типа "массив массивов строк".
$parser = new DB_Pgsql_Type_Array(
  new DB_Pgsql_Type_Array(
    new DB_Pgsql_Type_String()
  )
);
// Вернет array(array("one", "two"), array('three "3"', "four"))
$array = $parser->input('$Blk{'one,two},{"three \"3\"",four'}');

Можно обратно построить строку по массиву PHP для вставки в БД:

echo $parser->output($array);

Скачать библиотеку и посмотреть другие примеры: работа с массивами, композитными типами и ROWTYPE, hstore и т.д.
Tags:
Hubs:
+9
Comments 12
Comments Comments 12

Articles