2016-06-15 10 views
0

PHPコアにいくつかの変換問題があります。私はPostgreSQL databse v.9.5.3からPHP dibi/row(成功クエリのデータオブジェクト)にint4rangeデータ型(この[-1,10])を取得しようとしましたが、すべてのデータを正しく取得しますが、int4range getiingゼロではない値。どのようにint4range型を文字列にするか、またはPHPでより親しみやすいいくつかの数値範囲の形式を得るためのアイデアはありますか?PHPでPostgreSQLからint4rangeを取得するにはどうすればよいですか?

お返事ありがとうございます。

私はPOMM(Postgres Object Model Manager)を使用することはできません。このユーティリティは大規模でインストールが難しいため、私にとっては非常に侵略的な解決策です。私は、それが正しいことをPHPでいくつかのネイティブ関数を見つける必要があります。

+0

PDOまたは...を使用していますか? PDOの場合は、現在、レンジタイプをサポートしていないと思います。必要に応じて、SQLクエリの 'INT'または' INT'カラムに変換することができます。 – Nicarus

+0

私は、Nette DIBIレイヤーを使って、私はそれがPDOに由来していると思います。 –

+0

dibi: ドライバ:postgre ポート:5432 これはNetteフレームワークの設定ファイルの一部です –

答えて

0

さて、私はこのことで私の問題を解決する:

lower(bl.storeyrange) AS min_floor, 
upper(bl.storeyrange) AS max_floor 

私は2つの整数値にint4rangeを分割し、しかしatention! int4rangeは、離散的な数の範囲であり、上限値DROM上部()関数、範囲の上限を選択し、BUT = 1

上側= 7これ[1,7)

低いとです!間違っている

upperは6である必要がありますが、上位機能はそれを認識しません。

この解決策は、厳密にクエリで範囲タイプの変換に関する問題を解決しません。

0

多分あなたはインストールが面倒だったPomm 1.xについて話しています。

$ composer.phar require "pomm-project/foundation" 

そして、それがすべてです:Pomm 2.xコアライブラリ(財団)は、インストールが小さくてシンプルです。

<?php 

use PommProject\Foundation\Pomm; 

$loader = require __DIR__ . '/vendor/autoload.php'; 

$pomm = new Pomm(
    [ 
     'my_db' => 
      [ 
       'dsn' => 'pgsql://user:[email protected]: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ファイルは同じくらい簡単になると

<?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) { 
    } 
} 

をあなたはまだと思うなら、私の回答は関係ない、私に知らせて、私はそれを削除します。

関連する問題