Эта библиотека позволяет использовать доктрину (ORM или DBAL) с PostGIS, расширением пространственной базы данных для PostGRESQL.
В следующей таблице показаны версии, которые официально поддерживаются этой библиотекой.
Зависимость | Поддерживаемые версии |
---|---|
Постгис | 3.0 и 3.1 |
Postgresql | 11, 12 и 13 |
Доктрина Орм | ^2.9 |
Доктрина DBAL | ^2.13 и ^3.1 |
Установите последнюю версию с композитором.
composer require jsor/doctrine-postgis
Проверьте страницу Packagist для всех доступных версий.
Чтобы использовать библиотеку с доктриной 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
типов столбцов могут использоваться при сопоставлениях свойств (пожалуйста, прочитайте документы 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 Docs.
$ 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 схемы.
Большинство функций постгиса также доступны для языка доктрины (DQL) в соответствии с JsorDoctrinePostGISFunctions
Пространство имен.
Полный список всех поддерживаемых функций, см. Индекс функций.
Прочитайте специальную документацию 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 );
Есть удобный класс конфигураторов, который можно использовать для регистрации всех функций одновременно.
$ 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 ' );
Примечание: этот тип не подходит для использования в сопоставлениях объектов. Это просто предотвращает «неизвестный тип базы данных ...» исключения, которые были пропущены во время инспекций базы данных инструментом схемы.
Если вы хотите использовать этот тип в своих объектах, вы должны настроить реальные типы баз данных, например, с PostgreSQL для пакета доктрины.
Простая настройка Docker включена для запуска тестового набора против различных комбинаций PostgreSQL / PostGIS.
Все команды здесь должны быть запускаются от корневого проекта.
Во -первых, построить контейнер PHP. Это должно быть сделано только один раз.
./docker/build-php.sh
Установите зависимости через композитор.
./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 Ян Соргалла. Выпущено по лицензии MIT.