2012-06-16 7 views
1

У меня проблема с отображением встроенного документа для геопространственной индексации с использованием DoDrread2 OD с форматом YAML и MongoDB: Я бы попытался внедрить документ «Координаты» в Документ «Место», чтобы иметь возможность выполнять некоторые геопространственные индексированные запросы, но получил проблему с отображением.Геопространственное индексирование «Нет сопоставления для поля» с помощью YAML

Как видно на официальной документации: http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/indexes.html#geospatial-indexing

Но я работаю с форматом отображения YAML ... И есть эта проблема:

«отображение не найдено для поля«/ Applications/MAMP/HTDOCS /intramuros-web/src/IntraMuros/CoreBundle/Resources/config/doctrine/Coordinates.mongodb.yml 'в классе' IntraMuros \ CoreBundle \ Document \ Coordinates '. "

Вот мой файл YAML: Place.mongodb.yml, правильно помещенный в каталог ресурсов \ config моего пакета Symfony2.

IntraMuros\CoreBundle\Document\Place: 
    type: document 
    db: intramuros 
    collection: places 
    repositoryClass: IntraMuros\CoreBundle\Repository\PlaceRepository 
    fields: 
    id: 
     type: id 
     id: true 
    name: 
     type: string 
    address: 
     type: string 
    coordinates: 
     embedded: true 
     type: one 
     targetDocument: IntraMuros\CoreBundle\Document\Coordinates 
     cascade: all 
     strategy: set 
    indexes: 
     coordinates: 
     keys: 
      coordinates: 2d 

IntraMuros\CoreBundle\Document\Coordinates: 
    type: EmbeddedDocument 
    db: intramuros 
    fields: 
    latitude: 
     type: float 
    longitude: 
     type: float 

И вот класс PHP-документа, который я бы использовал.

<?php 

namespace IntraMuros\CoreBundle\Document; 


/** 
* @Document(requireIndexes=true) 
* @Indexes({ 
*  @Index(keys={"coordinates"="2d"}) 
* }) 
*/ 
class Place 
{ 
    /** 
    * @Id 
    */ 
    protected $id; 

    /** 
    * @String 
    */ 
    protected $name; 

    /** 
    * @String 
    */ 
    protected $address; 

    /** 
    * @EmbedOne(targetDocument="IntraMuros\CoreBundle\Document\Coordinates") 
    */ 
    protected $coordinates; 

    public function __construct($latitude = NULL, $longitude = NULL) 
    { 
     $coordinates = new Coordinates($latitude, $longitude); 
     $this->setCoordinates($coordinates); 
    } 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 

    public function setAddress($address) 
    { 
     $this->address = $address; 
    } 

    public function getAddress() 
    { 
     return $this->address; 
    } 

    public function setCoordinates($coordinates) 
    { 
     $this->coordinates = $coordinates; 
    } 

    public function getCoordinates($toArray = false) 
    { 
     if ($toArray) { 
      if ($this->coordinates) { 
       return $this->coordinates->toArray(); 
      } 
     } 
     return $this->coordinates; 
    } 

    public function toArray() 
    { 
     return array(
      'id' => $this->getId(), 
      'name' => $this->getName(), 
      'address' => $this->getAddress(), 
      'coordinates' => $this->getCoordinates(true) 
     ); 
    } 
} 


/** 
* @EmbeddedDocument 
*/ 
class Coordinates 
{ 
    /** 
    * @Float 
    */ 
    protected $latitude; 

    /** 
    * @Float 
    */ 
    protected $longitude; 

    public function __construct($latitude = NULL, $longitude = NULL) 
    { 
     $this->latitude = $latitude; 
     $this->longitude = $longitude; 
    } 

    public function setLatitude($latitude) 
    { 
     $this->latitude = $latitude; 
    } 

    public function getLatitude() 
    { 
     return $this->latitude; 
    } 

    public function setLongitude($longitude) 
    { 
     $this->longitude = $longitude; 
    } 

    public function getLongitude() 
    { 
     return $this->longitude; 
    } 

    public function toArray() 
    { 
     return array(
      'latitude' => $this->getLatitude(), 
      'longitude' => $this->getLongitude() 
     ); 
    } 
} 

Спасибо большое заранее, Бобби.

ответ

-1

Вы должны использовать аннотации вместо YML для отображения ваших документов.

Он будет работать очень легко.

Удачи вам! ;)

+1

Oooohh да, он отлично работает !! Черт, я никогда не забуду эту хорошую практику, чтобы использовать @Annotations для сопоставления сущностей баз данных и документов !!! –

+0

Я не думаю, что это действительно тот конструктивный ответ. ODM предлагает YML-сопоставление, поэтому «используя другой способ» не помогает тем, кто должен использовать нотацию YAML (из-за того, что вы не хотите заражать объект домена деталями реализации) – TobyG