У меня есть проблема конвертации в ядре PHP. Я попытался получить тип данных int4range (например, [-1, 10)) из базы данных PostgreSQL v.9.5.3, в PHP dibi / row (объект данных из успешного запроса), я получаю все данные правильно, но в поле с получением int4range Нулевое значение, а не NULL. Любая идея, как получить тип int4range в строку, или какой-либо другой формат числового диапазона более дружественным с PHP?
Спасибо за ответы.
КСТАТИ: Я могу использовать POMM (Postgres Object Model Manager), потому что это утилита является большой и трудной для установки, это кажется мне столь же инвазивным разрешением. Я должен найти некоторую нативную функцию в PHP, которая сделала это правильно.
Хорошо, я решаю свою проблему этим:
lower(bl.storeyrange) AS min_floor,
upper(bl.storeyrange) AS max_floor
Я разбил int4range на два целых числа, НО внимание! int4range — это дискретные диапазоны чисел, а верхнее значение из функции upper () выбирает верхнюю границу из диапазона, НО с этим [1,7)
ниже = 1
верхний = 7 !!! некорректный
верхняя должна быть 6, но верхняя функция не распознает его.
И это решение, не решающее проблему с преобразованием типов диапазонов строго в запросах.
Может быть, вы говорите о Pomm 1.x, который был утомительным для установки. Pomm 2.x Базовая библиотека (Foundation) небольшая и простая в установке:
$ composer.phar require "pomm-project/foundation"
И это все.
После того, как композитор сделал свое волшебство, ваш PHP-файл так же прост, как:
<?php
use PommProject\Foundation\Pomm;
$loader = require __DIR__ . '/vendor/autoload.php';
$pomm = new Pomm(
[
'my_db' =>
[
'dsn' => 'pgsql://user:pass@host:port/db_name'
]
]
);
$iterator = $pomm['my_db']
->getQueryManager()
->query('SELECT range_field, … ', ['parameter1', …])
;
if ($iterator->isEmpty()) {
printf("No results.\n");
} else {
foreach ($iterator as $row) {
printf(
"Range is from '%d' to '%d'.\n",
$row['range_field']->start_limit,
$row['range_field']->end_limit
);
}
}
Вы даже можете использовать диапазон в качестве параметра в своих SQL-запросах:
<?php
// …
use PommProject\Foundation\Converter\Type\NumRange;
$sql = <<<SQL
UPDATE my_table
SET …
WHERE int_field <@ $*::int4range
RETURNING field1, …
SQL;
$iterator = $pomm['my_db']
->getQueryManager()
->query($sql, [new NumRange('[1, 42)')])
;
if ($iterator->isEmpty()) {
printf("No rows updated.\n");
} else {
foreach ($iterator as $row) {
}
}
Если вы все еще считаете мой ответ неуместным, дайте мне знать, и я его удалю.