Perpustakaan ini memungkinkan Anda untuk menggunakan doktrin (ORM atau DBAL) dengan postgis, ekstensi basis data spasial untuk PostgreSQL.
Tabel berikut menunjukkan versi yang secara resmi didukung oleh perpustakaan ini.
Ketergantungan | Versi yang didukung |
---|---|
Postgis | 3.0 dan 3.1 |
PostgreSQL | 11, 12 dan 13 |
Doktrin Orm | ^2.9 |
Doktrin Dbal | ^2.13 dan ^3.1 |
Instal versi terbaru dengan komposer.
composer require jsor/doctrine-postgis
Periksa halaman Packagist untuk semua versi yang tersedia.
Untuk menggunakan pustaka dengan Doctrine ORM, daftarkan pelanggan Acara ORMSchemaEventSubscriber
.
use Jsor Doctrine PostGIS Event ORMSchemaEventSubscriber ;
$ entityManager -> getEventManager ()-> addEventSubscriber ( new ORMSchemaEventSubscriber ());
Untuk menggunakannya hanya dengan DBAL, daftarkan pelanggan Acara DBALSchemaEventSubscriber
.
use Jsor Doctrine PostGIS Event DBALSchemaEventSubscriber ;
$ connection -> getEventManager ()-> addEventSubscriber ( new DBALSchemaEventSubscriber ());
Untuk mengintegrasikan perpustakaan ini ke dalam proyek Symfony, baca dokumentasi Symfony khusus.
Setelah pelanggan acara terdaftar, geometry
tipe kolom dan geography
dapat digunakan dalam pemetaan properti (silakan baca dokumen postgis untuk memahami perbedaan antara kedua jenis ini).
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 ;
}
Ada 2 opsi untuk mengonfigurasi geometri.
geometry_type
Ini mendefinisikan jenis geometri, seperti POINT
, LINESTRING
dll. Jika Anda menghilangkan opsi ini, GEOMETRY
tipe generik digunakan.srid
Ini mendefinisikan pengidentifikasi sistem referensi spasial (SRID) geometri. 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 ;
}
}
Nilai yang disediakan untuk properti harus dalam format WKT. Harap dicatat, bahwa nilai yang dikembalikan dari database mungkin berbeda dari nilai yang telah Anda tetapkan. Perpustakaan menggunakan ST_ASEWKT untuk menyimpan informasi sebanyak mungkin (seperti SRID). Baca lebih lanjut di dokumen PostGIS.
$ entity = new MyEntity (
point: ' POINT(-122.0845187 37.4220761) ' ,
point4D: ' POINT(1 2 3 4) ' ,
pointWithSRID: ' SRID=3785;POINT(-122.0845187 37.4220761) ' ,
);
Indeks spasial dapat didefinisikan untuk bidang geometri dengan mengatur bendera spatial
.
use Doctrine ORM Mapping as ORM ;
#[ ORM Entity ]
#[ ORM Index (
fields: [ ' pointWithSRID ' ],
flags: [ ' spatial ' ],
)]
class MyEntity
{
}
Dukungan penuh untuk alat skema ORM dan manajer skema DBAL disediakan.
Sebagian besar fungsi postgis juga tersedia untuk Doctrine Query Language (DQL) di bawah JsorDoctrinePostGISFunctions
Namespace.
Untuk daftar lengkap semua fungsi yang didukung, lihat indeks fungsi.
Baca dokumentasi Symfony khusus tentang cara mengkonfigurasi fungsi dengan Symfony.
Fungsi harus didaftarkan dengan instance 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 );
Ada kelas konfigurator kenyamanan yang dapat digunakan untuk mendaftarkan semua fungsi sekaligus.
$ configuration = new Doctrine ORM Configuration ();
Jsor Doctrine PostGIS Functions Configurator :: configure ( $ configuration );
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
Baca dokumentasi Symfony khusus tentang cara menangani masalah -masalah itu dengan Symfony.
Karena postgis dapat menambahkan beberapa skema baru, seperti topology
, tiger
dan tiger_data
, Anda mungkin ingin mengecualikan mereka dari ditangani oleh doktrin.
Ini dapat dilakukan dengan mengkonfigurasi filter aset skema.
$ 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 );
Terkadang, alat skema tersandung pada jenis database yang tidak dapat ditangani. Pengecualian umum adalah sesuatu seperti
DoctrineDBALException: Unknown database type _text requested, DoctrineDBALPlatformsPostgreSQL100Platform may not support it.
Untuk menyelesaikan ini, jenis database yang tidak dikenal dapat dipetakan ke jenis yang diketahui.
$ configuration = new Doctrine ORM Configuration ();
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' _text ' , ' string ' );
Catatan: Jenis ini kemudian tidak cocok untuk digunakan dalam pemetaan entitas. Ini hanya mencegah "Tipe Basis Data yang Tidak Diketahui ..." Pengecualian yang dilemparkan selama inspeksi database oleh alat skema.
Jika Anda ingin menggunakan tipe ini di entitas Anda, Anda harus mengkonfigurasi jenis database nyata, misalnya dengan PostgreSQL untuk paket doktrin.
Pengaturan Docker sederhana disertakan untuk menjalankan suite test terhadap berbagai kombinasi PostgreSQL / PostGIS.
Semua perintah di sini harus dijalankan dari root proyek.
Pertama, bangun wadah PHP. Ini harus dilakukan hanya sekali.
./docker/build-php.sh
Instal dependensi melalui komposer.
./docker/run-php.sh composer install
Selanjutnya, mulailah wadah database.
docker compose -f ./docker/docker-compose.yml up -d
Ada sejumlah skrip pintasan yang tersedia untuk menjalankan perintah di dalam wadah PHP yang terhubung ke wadah database tertentu.
Nama skrip mengikuti pola run-<POSTGRESQL_VERSION>-<POSTGIS_VERSION>.sh
.
Untuk menjalankan test suite melawan PostgreSQL 13 dengan Postgis 3.1, gunakan skrip ./docker/run-13-31.sh
.
./docker/run-13-31.sh vendor/bin/phpunit --exclude-group=postgis-3.0
Perhatikan, bahwa kami mengecualikan tes yang ditargetkan di PostGIS 3.0 di sini. Saat menjalankan tes terhadap PostGIS 3.0, mengecualikan tes untuk 3.1.
./docker/run-13-30.sh vendor/bin/phpunit --exclude-group=postgis-3.1
Hak Cipta (C) 2014-2024 Jan Sorgalla. Dirilis di bawah lisensi MIT.