2016-05-18 2 views
0

Я пытаюсь использовать ReferenceOne для MongoDB ODM Сущности, но тогда файл Доктрина Hydrator генерируется, возвращается следующее сообщение об ошибке:Mongoid рассматривается как массив по DoctrineODM

Fatal error: Cannot use object of type MongoId as array in /var/www/project/data/DoctrineMongoODMModule/Hydrator/ApplicationDocumentTokenEntryHydrator.php

Вот определение из недвижимость в вопросе:

/** 
     * Page Mongo Id from Pages entry 
     * 
     * @ODM\Field(name="pageInternalId", type="object_id") 
     * @ODM\ReferenceOne(targetDocument="Page\Document\PagesEntry") 
     * @var \MongoId 
     */ 
     protected $pageInternalId; 

Я вырыл немного в сгенерированном увлажняющее и в DoctrineODMModule и выяснили, что следующий фрагмент является проблемой

if (isset($this->class->fieldMappings['pageInternalId']['simple']) && $this->class->fieldMappings['pageInternalId']['simple']) { 
       $className = $this->class->fieldMappings['pageInternalId']['targetDocument']; 
       $mongoId = $reference; 
      } else { 
       $className = $this->unitOfWork->getClassNameForAssociation($this->class->fieldMappings['pageInternalId'], $reference); 
       **$mongoId = $reference['$id'];** 
      } 

По какой-то причине полеМарпирование не считается/задано как «простое» - если я правильно его понимаю, если я могу установить его как таковой, он войдет в первое предложение и должен работать правильно. Тем не менее, я не нашел ничего в Doctrine documentation о настройке свойства как «простого». Как определяется это значение, может ли оно быть задано при определении свойства?

Я оставил неотвязную (imho) детали, если требуется больше информации, я предоставлю ее. Заранее спасибо!

Я использую DoctrineODMModule 0.9.1

ответ

0

Поле должно быть отображено либо как @ReferenceOne или @Field - Сочетание этих двух может быть виновником выпуска. Кроме того, свойство, отображаемое как @ReferenceOne, будет содержать ссылочный объект (с точки зрения кода, в базе данных это будет фактически MongoID, но вам не нужно заботиться об этом, так как это задача ODM).

+0

На самом деле, добавив опцию 'simple = "true" при определении свойства почти фиксированной - теперь она работает, но что-то еще привлекло мое внимание - сгенерированный гидратор имеет следующую строку: $ return = $ this- > dm-> getReference ($ className, $ id); , который по документации возвращает только «частичный объект, который имеет только свой идентификатор», что, imho бесполезно (у меня уже есть значение идентификатора из поля). Может ли кто-нибудь предоставить указателям, как действовать? –

+0

Частичный объект - это «Прокси», который будет инициализирован и загрузит все его данные, когда они вам понадобятся (т.е. при первом доступе свойств/методов, который не получает идентификатор) - это для ленивой загрузки – malarzm

+0

Да, оказалось, что он работает правильно, но Xdebug не разбирает их правильно, по какой-то причине. –