このライブラリを使用すると、PostgreSQLの空間データベース拡張機能であるPostGISでDoctrine(ORMまたはDBAL)を使用できます。
次の表は、このライブラリによって正式にサポートされているバージョンを示しています。
依存 | サポートされているバージョン |
---|---|
ポストギス | 3.0および3.1 |
postgreSql | 11、12、13 |
ドクトリンorm | ^2.9 |
ドクトリンdbal | ^2.13および ^3.1 |
Composerで最新バージョンをインストールします。
composer require jsor/doctrine-postgis
利用可能なすべてのバージョンについては、Packagistページを確認してください。
Doctrine ormでライブラリを使用するには、 ORMSchemaEventSubscriber
イベントサブスクライバーを登録します。
use Jsor Doctrine PostGIS Event ORMSchemaEventSubscriber ;
$ entityManager -> getEventManager ()-> addEventSubscriber ( new ORMSchemaEventSubscriber ());
DBALのみで使用するには、 DBALSchemaEventSubscriber
イベントサブスクライバーを登録します。
use Jsor Doctrine PostGIS Event DBALSchemaEventSubscriber ;
$ connection -> getEventManager ()-> addEventSubscriber ( new DBALSchemaEventSubscriber ());
このライブラリをSymfonyプロジェクトに統合するには、専用のSymfonyドキュメントをお読みください。
イベントサブスクライバーが登録されると、列タイプのgeometry
とgeography
プロパティマッピングで使用できます(これら2つのタイプの違いを理解するために、PostGISドキュメントを読んでください)。
use Doctrine ORM Mapping as ORM ;
use Jsor Doctrine PostGIS Types PostGISType ;
#[ ORM Entity ]
class MyEntity
{
#[ ORM Column (type: PostGISType :: GEOMETRY )]
private string $ geometry ;
#[ ORM Column (type: PostGISType :: GEOGRAPHY )]
private string $ geography ;
}
ジオメトリを構成する2つのオプションがあります。
geometry_type
これは、 POINT
、 LINESTRING
などのジオメトリのタイプを定義します。このオプションを省略すると、汎用型GEOMETRY
が使用されます。srid
これは、ジオメトリの空間参照システム識別子(SRID)を定義します。 use Doctrine ORM Mapping as ORM ;
use Jsor Doctrine PostGIS Types PostGISType ;
#[ ORM Entity ]
class MyEntity
{
#[ ORM Column (
type: PostGISType :: GEOMETRY ,
options: [ ' geometry_type ' => ' POINT ' ],
)]
public string $ point ;
#[ ORM Column (
type: PostGISType :: GEOMETRY ,
options: [ ' geometry_type ' => ' POINTZM ' ],
)]
public string $ point4D ;
#[ ORM Column (
type: PostGISType :: GEOMETRY ,
options: [ ' geometry_type ' => ' POINT ' , ' srid ' => 3785 ],
)]
public string $ pointWithSRID ;
public function __construct (
string $ point ,
string $ point4D ,
string $ pointWithSRID ,
) {
$ this -> point = $ point ;
$ this -> point4D = $ point4D ;
$ this -> pointWithSRID = $ pointWithSRID ;
}
}
プロパティに提供される値は、WKT形式でなければなりません。データベースから返される値は、設定した値とは異なる場合があります。ライブラリはST_ASEWKTを使用して、できるだけ多くの情報を保持します(SRIDのように)。 PostGISドキュメントで詳細をご覧ください。
$ entity = new MyEntity (
point: ' POINT(-122.0845187 37.4220761) ' ,
point4D: ' POINT(1 2 3 4) ' ,
pointWithSRID: ' SRID=3785;POINT(-122.0845187 37.4220761) ' ,
);
空間インデックスは、 spatial
フラグを設定することにより、ジオメトリフィールドに定義できます。
use Doctrine ORM Mapping as ORM ;
#[ ORM Entity ]
#[ ORM Index (
fields: [ ' pointWithSRID ' ],
flags: [ ' spatial ' ],
)]
class MyEntity
{
}
ORMスキーマツールとDBALスキーママネージャーの完全なサポートが提供されます。
ほとんどのPostGIS関数はJsorDoctrinePostGISFunctions
Namespaceの下で、Doctrine Query Language(DQL)にも使用できます。
サポートされているすべての機能の完全なリストについては、関数インデックスを参照してください。
Symfonyで関数を構成する方法に関する専用のSymfonyドキュメントを読んでください。
関数は、 DoctrineORMConfiguration
インスタンスに登録する必要があります。
$ configuration = new Doctrine ORM Configuration ();
$ configuration -> addCustomStringFunction (
' ST_Within ' ,
Jsor Doctrine PostGIS Functions ST_Within ::class
);
$ configuration -> addCustomNumericFunction (
' ST_Distance ' ,
Jsor Doctrine PostGIS Functions ST_Distance ::class
);
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
すべての関数を一度に登録するために使用できる便利なConfiguratorクラスがあります。
$ configuration = new Doctrine ORM Configuration ();
Jsor Doctrine PostGIS Functions Configurator :: configure ( $ configuration );
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
Symfonyでこれらの問題を処理する方法に関する専用のSymfonyドキュメントを読んでください。
PostGISはtopology
、 tiger
、 tiger_data
などのいくつかの新しいスキーマを追加できるため、教義によって処理されることからそれらを除外することをお勧めします。
これは、スキーマアセットフィルターを構成することで実行できます。
$ configuration = new Doctrine ORM Configuration ();
$ configuration -> setSchemaAssetsFilter ( static function ( $ assetName ): bool {
if ( $ assetName instanceof AbstractAsset ) {
$ assetName = $ assetName -> getName ();
}
return ( bool ) preg_match ( ' /^(?!tiger)(?!topology)/ ' , $ assetName );
});
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
時々、スキーマツールが処理できないデータベースタイプにつまずくことがあります。一般的な例外はようなものです
DoctrineDBALException: Unknown database type _text requested, DoctrineDBALPlatformsPostgreSQL100Platform may not support it.
これを解決するために、未知のデータベースタイプを既知の型にマッピングできます。
$ configuration = new Doctrine ORM Configuration ();
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' _text ' , ' string ' );
注:このタイプは、エンティティマッピングで使用するのに適していません。スキーマツールによるデータベース検査中にスローされた「未知のデータベースタイプ...」の例外を防ぐだけです。
エンティティでこのタイプを使用する場合は、DoctrineパッケージのPostgreSQLなどの実際のデータベースタイプを構成する必要があります。
さまざまなPostgreSQL / PostGISの組み合わせに対してテストスイートを実行するために、簡単なDockerセットアップが含まれています。
ここのすべてのコマンドは、プロジェクトルートから実行する必要があります。
まず、PHPコンテナを構築します。これは一度だけ行う必要があります。
./docker/build-php.sh
Composerを介して依存関係をインストールします。
./docker/run-php.sh composer install
次に、データベースコンテナを起動します。
docker compose -f ./docker/docker-compose.yml up -d
特定のデータベースコンテナに接続されたPHPコンテナ内でコマンドを実行するために利用できるショートカットスクリプトがいくつかあります。
スクリプト名はパターンrun-<POSTGRESQL_VERSION>-<POSTGIS_VERSION>.sh
に従います。
Postgresql 13に対してPostgis 3.1を使用してテストスイートを実行するには、スクリプトを使用してください./docker/run-13-31.sh
。
./docker/run-13-31.sh vendor/bin/phpunit --exclude-group=postgis-3.0
ここでは、PostGIS 3.0を対象としたテストを除外することに注意してください。 PostGIS 3.0に対してテストを実行するときは、3.1のテストを除外します。
./docker/run-13-30.sh vendor/bin/phpunit --exclude-group=postgis-3.1
Copyright(c)2014-2024 Jan Sorgalla。 MITライセンスの下でリリースされました。