تتيح لك هذه المكتبة استخدام العقيدة (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 ، قم بتسجيل مشترك حدث 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'S). اقرأ المزيد في مستندات 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
{
}
يتم توفير الدعم الكامل لأداة Schema ORM ومدير Dbal Schema.
تتوفر معظم وظائف PostGIS أيضًا لغية الاستعلام العقيدة (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 );
هناك فئة Configurator مريحة يمكن استخدامها لتسجيل جميع الوظائف في وقت واحد.
$ 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
حقوق الطبع والنشر (C) 2014-2024 جان سورغالا. صدر تحت رخصة معهد ماساتشوستس للتكنولوجيا.