Mit dieser Bibliothek können Sie die Doktrin (ORM oder DBAL) mit postgis verwenden, der räumlichen Datenbankerweiterung für PostgreSQL.
Die folgende Tabelle zeigt die Versionen, die offiziell von dieser Bibliothek unterstützt werden.
Abhängigkeit | Unterstützte Versionen |
---|---|
Postgis | 3.0 und 3.1 |
PostgreSQL | 11, 12 und 13 |
Doktrin Orm | ^2.9 |
Lehre DBAL | ^2.13 und ^3.1 |
Installieren Sie die neueste Version mit Composer.
composer require jsor/doctrine-postgis
Überprüfen Sie die Packagist -Seite für alle verfügbaren Versionen.
Um die Bibliothek mit der Doktrin -ORM zu verwenden, registrieren Sie den Abonnenten ORMSchemaEventSubscriber
Event Event.
use Jsor Doctrine PostGIS Event ORMSchemaEventSubscriber ;
$ entityManager -> getEventManager ()-> addEventSubscriber ( new ORMSchemaEventSubscriber ());
Um es nur mit dem DBAL zu verwenden, registrieren Sie den Abonnenten DBALSchemaEventSubscriber
Event.
use Jsor Doctrine PostGIS Event DBALSchemaEventSubscriber ;
$ connection -> getEventManager ()-> addEventSubscriber ( new DBALSchemaEventSubscriber ());
Lesen Sie die dedizierte Symfony -Dokumentation, um diese Bibliothek in ein Symfony -Projekt zu integrieren.
Sobald der Event -Abonnent registriert ist, können die Spaltentypen geometry
und geography
in Eigenschaftszuordnungen verwendet werden (bitte lesen Sie die PostGIS -Dokumente, um den Unterschied zwischen diesen beiden Typen zu verstehen).
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 ;
}
Es gibt 2 Optionen, um die Geometrie zu konfigurieren.
geometry_type
Dies definiert den Typ der Geometrie wie POINT
, LINESTRING
usw. Wenn Sie diese Option weglassen, wird die generische GEOMETRY
verwendet.srid
Dies definiert die räumliche Referenzsystemkennung (SRID) der Geometrie. 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 ;
}
}
Die für die Eigenschaften angegebenen Werte müssen im WKT -Format liegen. Bitte beachten Sie, dass die aus der Datenbank zurückgegebenen Werte von den von Ihnen festgelegten Werten abweichen können. Die Bibliothek verwendet ST_ASEWKT, um so viele Informationen wie möglich beizubehalten (wie SRIDs). Lesen Sie mehr in den Postgis -Dokumenten.
$ entity = new MyEntity (
point: ' POINT(-122.0845187 37.4220761) ' ,
point4D: ' POINT(1 2 3 4) ' ,
pointWithSRID: ' SRID=3785;POINT(-122.0845187 37.4220761) ' ,
);
Räumliche Indizes können für Geometriefelder definiert werden, indem die spatial
Flagge festgelegt wird.
use Doctrine ORM Mapping as ORM ;
#[ ORM Entity ]
#[ ORM Index (
fields: [ ' pointWithSRID ' ],
flags: [ ' spatial ' ],
)]
class MyEntity
{
}
Die vollständige Unterstützung für das ORM -Schema -Tool und den DBAL -Schema -Manager wird bereitgestellt.
Die meisten postGIS -Funktionen sind auch für die Lehre Query Language (DQL) unter dem Namespace JsorDoctrinePostGISFunctions
verfügbar.
Eine vollständige Liste aller unterstützten Funktionen finden Sie im Funktionsindex.
Lesen Sie die dedizierte Symfony -Dokumentation zum Konfigurieren der Funktionen mit Symfony.
Die Funktionen müssen bei der DoctrineORMConfiguration
registriert werden.
$ 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 );
Es gibt eine Convenience -Konfiguratorklasse, mit der alle Funktionen gleichzeitig registriert werden können.
$ configuration = new Doctrine ORM Configuration ();
Jsor Doctrine PostGIS Functions Configurator :: configure ( $ configuration );
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
Lesen Sie die dedizierte Symfony -Dokumentation zum Umgang mit diesen Problemen mit Symfony.
Da PostGIS einige neue Schemata wie topology
, tiger
und tiger_data
hinzufügen kann, möchten Sie sie vielleicht von der Doktrin ausschließen.
Dies kann durch Konfigurieren eines Schema -Vermögensfilters erfolgen.
$ 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 );
Manchmal stolpert das Schema -Tool auf Datenbanktypen, die es nicht verarbeiten kann. Eine häufige Ausnahme ist so etwas wie
DoctrineDBALException: Unknown database type _text requested, DoctrineDBALPlatformsPostgreSQL100Platform may not support it.
Um dies zu lösen, können die unbekannten Datenbanktypen bekannten Typen abgebildet werden.
$ configuration = new Doctrine ORM Configuration ();
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' _text ' , ' string ' );
HINWEIS: Dieser Typ ist dann nicht für die Verwendung in Entitätszuordnungen geeignet. Es verhindert nur "Unbekannten Datenbanktyp ..." -Annahmen, die während der Datenbankinspektionen durch das Schema -Tool geworfen werden.
Wenn Sie diesen Typ in Ihren Entitäten verwenden möchten, müssen Sie echte Datenbanktypen konfigurieren, z. B. mit dem PostgreSQL für Doctrine -Paket.
Ein einfaches Docker -Setup ist enthalten, um die Testsuite gegen die verschiedenen PostgreSQL / PostgIS -Kombinationen auszuführen.
Alle Befehle hier sollten aus der Projektwurzel ausgeführt werden.
Erstellen Sie zuerst den PHP -Behälter. Dies muss nur einmal erfolgen.
./docker/build-php.sh
Installieren Sie Abhängigkeiten über Komponisten.
./docker/run-php.sh composer install
Starten Sie als Nächstes die Datenbankcontainer.
docker compose -f ./docker/docker-compose.yml up -d
Es stehen eine Reihe von Abkürzungsskripten zur Verfügung, mit denen Befehle in dem PHP -Container ausgeführt werden können, das mit bestimmten Datenbankcontainern verbunden ist.
Die Skriptnamen folgen dem Muster run-<POSTGRESQL_VERSION>-<POSTGIS_VERSION>.sh
.
Verwenden Sie das Skript ./docker/run-13-31.sh
, um die Testsuite gegen PostgreSQL 13 mit PostGIS 3.1 auszuführen.
./docker/run-13-31.sh vendor/bin/phpunit --exclude-group=postgis-3.0
Beachten Sie, dass wir hier auf PostGIS 3.0 getestet werden. Wenn Sie Tests gegen PostGIS 3.0 durchführen, schließen Sie die Tests für 3.1 aus.
./docker/run-13-30.sh vendor/bin/phpunit --exclude-group=postgis-3.1
Copyright (C) 2014-2024 Jan Sorgalla. Unter der MIT -Lizenz veröffentlicht.