ไลบรารีนี้ช่วยให้คุณใช้หลักคำสอน (ORM หรือ DBAL) ด้วย postgis ส่วนขยายฐานข้อมูลเชิงพื้นที่สำหรับ postgreSQL
ตารางต่อไปนี้แสดงเวอร์ชันที่ได้รับการสนับสนุนอย่างเป็นทางการโดยห้องสมุดนี้
การพึ่งพาอาศัยกัน | เวอร์ชันที่รองรับ |
---|---|
postgis | 3.0 และ 3.1 |
PostgreSQL | 11, 12 และ 13 |
หลักคำสอน orm | ^2.9 |
หลักคำสอน dbal | ^2.13 และ ^3.1 |
ติดตั้งเวอร์ชันล่าสุดด้วยนักแต่งเพลง
composer require jsor/doctrine-postgis
ตรวจสอบหน้า Packagist สำหรับทุกเวอร์ชันที่มีอยู่
หากต้องการใช้ไลบรารีกับหลักคำสอน ORM ให้ลงทะเบียนสมาชิก Event 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
$ 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 Schema และ DBAL Schema Manager นั้นมีให้
ฟังก์ชั่น postgis ส่วนใหญ่ยังมีให้สำหรับภาษาคิวรีหลักคำสอน (DQL) ภายใต้ JsorDoctrinePostGISFunctions
NAMESPACE
สำหรับรายการทั้งหมดของฟังก์ชั่นที่รองรับทั้งหมดดูดัชนีฟังก์ชั่น
อ่านเอกสาร 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 สามารถเพิ่ม schemas ใหม่สองสามอย่างเช่น 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
ลิขสิทธิ์ (C) 2014-2024 Jan Sorgalla ปล่อยภายใต้ใบอนุญาต MIT