Когда я получаю данные из базы данных postgresql с pg_query, pg_fetch_assoc все числовые поля возвращаются в виде строк. Есть ли способ обойти это, или я должен прибегать к тому, чтобы придать каждому полю то, что мне нужно?
Это то, что делает PHP. Из руководства :
Каждое значение в массиве представляется в виде строки.
Может быть, немного не по теме – дайте мне знать, и я откажусь от ответа – но все же это одна из причин, по которым вышел проект Pomm: поскольку по умолчанию логические значения возвращаются как строки 't' и 'f' ( правда и ложь).
Это очень неудобно и не позволяет разработчикам использовать сложные и полезные структуры, такие как массивы, диапазоны, геометрические типы и т. Д.
Пакет Pomm's Foundation использует функцию pg_field_type для запуска преобразователя по результатам и параметрам:
select array[1, 2, 3]::int4[] as some_ints, now() as a_date, point(1,2) as a_point, true as a_bool ;
Выполнение этого запроса с использованием PDO или собственной библиотеки Postgres PHP возвращает массив строк, например:
some_ints │ a_date │ a_point │ a_bool {1,2,3} │ 2015-07-31 07:35:36.143182+00 │ (1,2) │ t
Выполнение этого запроса с использованием Pomm's Foundation возвращает итератор с единственным результатом массива:
[ "some_ints" => [ 1, 2, 3 ], "a_date" => <DateTime> { date: "2015-07-31 07:45:21.438447", timezone_type: 1, timezone: "+00:00" }, "a_point" => <PommProject\Foundation\Converter\Type\Point> { x: 1.0, y: 2.0 }, "a_bool" => true ]
Система конвертера также работает для параметров запроса:
$sql = <<<SQL select 2 = ANY($*::int4[]) as contain_two, now() > $*::timestamptz as is_past, circle(point(0,0), 5) @> $*::point as is_in_circle ; SQL; $res = $pomm ->getDefaultSession() ->getQueryManager() ->query($sql, [ [1,2,3], new \DateTime('yesterday'), new \PommProject\Foundation\Converter\Type\Point('(3,3)') ]) ->current() ;
Это возвращает:
[ "contain_two" => true, "is_past" => true, "is_in_circle" => true ]
Можно даже создать собственные преобразователи и объявить, как можно преобразовать составные (строковые) типы. Более подробная статья об этом здесь .