0

PostGISジオメトリ列を持つPostgreSQLデータベースを使用しています。

ジオメトリ列がST_AsEWKT関数を使用して膨張し、ST_GeomFromEWKT関数を使用して収縮するようにResultクラスを構成したいと思います。

「find」メソッドが通常どおりに機能し、「update」メソッドと「create」メソッドも通常どおりに機能するように、これを行う方法はありますか。回避できれば、テーブルごとに特殊なクエリを作成する必要はありません。

カラムを膨らませるためにハックを使用できます。

__PACKAGE__->inflate_column( 'geo', {
  inflate => sub {
    my ($raw_value, $result) = @_;
    my $col = $result->result_source->resultset->get_column("geo")->func("ST_AsEWKT");
  },
});

しかし、デフレをどのように実施するかはわかりません。

前もって感謝します。

4

1 に答える 1

0

DBIx::Class::InflateColumn を使用した実用的なソリューションがあります。ジオメトリ列ごとにデータベースに対して個別のクエリを作成するため、理想的ではありません。(理想的には、DBIC を変更せずに実行できる場合でも、このフィールドへのクエリに適切な関数を使用するように DBIC に指示する方法が必要です。)

答えは以下です。

__PACKAGE__->load_components("InflateColumn");

__PACKAGE__->inflate_column( 'geo', {

  inflate => sub {
    my ($value, $result) = @_;

    my $dbh = $result->result_source->storage->dbh;
    my $sth = $dbh->prepare( q{SELECT ST_AsEWKT(?)} );
    $sth->execute( $value );
    my @row = $sth->fetchrow;

    return $row[0];
  },

  deflate => sub {
    my ($value, $result) = @_;

    my $dbh = $result->result_source->storage->dbh;
    my $sth = $dbh->prepare( q{SELECT ST_GeomFromEWKT(?)} );
    $sth->execute( $value );
    my @row = $sth->fetchrow;

    return $row[0];
  },

});
于 2013-01-03T22:42:44.900 に答える