이 라이브러리를 사용하면 PostGis의 공간 데이터베이스 확장자 인 Postgis와 함께 교리 (ORM 또는 DBAL)를 사용할 수 있습니다.
다음 표는이 라이브러리에서 공식적으로 지원되는 버전을 보여줍니다.
의존 | 지원되는 버전 |
---|---|
Postgis | 3.0 및 3.1 |
PostgreSQL | 11, 12 및 13 |
교리 ORM | ^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 ;
}
지오메트리를 구성하는 두 가지 옵션이 있습니다.
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
네임 스페이스의 교리 쿼리 언어 (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 );
모든 기능을 한 번에 등록하는 데 사용할 수있는 편의 구성 자 클래스가 있습니다.
$ 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 for Doctrine 패키지).
간단한 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
따릅니다.
Postgis 3.1의 PostgreSQL 13에 대해 테스트 스위트를 실행하려면 스크립트 ./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
저작권 (C) 2014-2024 Jan Sorgalla. MIT 라이센스에 따라 릴리스.