Как я могу расширить Doctrine 2 для обработки пространственного MySQL (тип поля "точка") в CodeIgniter 2? - PullRequest
3 голосов
/ 06 мая 2011

Я кодирую веб-сайт, используя CodeIgniter 2 в качестве моей платформы, и недавно я начал пытаться использовать Doctrine 2 для ORM.

В моей базе данных должны храниться пространственные данные (например, столбец типа "point"), и, очевидно, Doctrine не может справиться с этим из коробки.

Я искал по всему интернету и нашел только следующие советы: http://codeutopia.net/blog/2011/02/19/using-spatial-data-in-doctrine-2/

Но в этой статье неясно, кудасохранить эти файлы и что еще нужно настроить.Я пытался связаться с автором и не получил ответа.

Может ли кто-нибудь помочь, пожалуйста?

Спасибо!Райан

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Это было давно, поэтому я забыл некоторые подробности, но я поместил эти 4 файла в папку с именем CodeIgniter / application / library / Doctrine / CustomAddon:

  • Distance.php
  • Point.php
  • PointStr.php
  • PointType.php

Я задаю пространство имен каждого как «CustomAddon».

Затем в нижней части CodeIgniter / application / library / Doctrine.php я положил:

require_once APPPATH . 'libraries/Doctrine/CustomAddon/Distance.php';
require_once APPPATH . 'libraries/Doctrine/CustomAddon/Point.php';
require_once APPPATH . 'libraries/Doctrine/CustomAddon/PointStr.php';
require_once APPPATH . 'libraries/Doctrine/CustomAddon/PointType.php';
Doctrine\DBAL\Types\Type::addType('point', 'CustomAddon\PointType');
//Assuming $config is a Doctrine\ORM\Configuration object used to configure the EM
$config->addCustomNumericFunction('DISTANCE', 'CustomAddon\Distance');
$config->addCustomNumericFunction('POINT_STR', 'CustomAddon\PointStr');

// Create EntityManager
$this->em = EntityManager::create($connectionOptions, $config);

Тогда использование выглядит примерно так:

$point = new \CustomAddon\Point($geo['lat'], $geo['lon']);
0 голосов
/ 16 июля 2011

Я работаю с доктриной 1.2, поэтому не знаю, сработает ли это для вас. В версии 1.2.4 вы можете объявить тип точки в yaml или в вашей модели, и он будет хорошо переведен в базу данных. Чтобы сохранить данные в виде точки, вам нужно создать новое выражение доктрины, например:

$phone->point = new Doctrine_Expression("GEOMFROMTEXT('POINT(25 10)')");

С данными, которые вам нужны вместо этих 25 и 10, конечно. С доктриной 1.2.4 это будет нормально работать и сохранять данные в БД. Чтобы получить ваши данные, вам просто нужно использовать такой оператор выбора:

$query = Doctrine_Query::create()
         ->select ('X(p.point), Y(p.point)')
         ->from('Points p');

И у вас будет массив с именем point с двумя элементами (x и y) в вашем объекте. Как я уже сказал, я работаю с 1.2.4, но если в этой версии есть простой способ работы с точками, то что-то похожее должно работать с доктриной 2. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...