У меня есть класс вроде следующего:
/** @Entity **/ class orgGroup{ //id and stuff... /** * @Column(type="string") **/ private $name; /** * @Column(type="string", nullable=true) **/ private $description; /** * @ManyToOne(targetEntity="orgGroupType", inversedBy="_orgGroups") * @JoinColumn(name="_orgGroupType") **/ private $_orgGroupType; //... }
Но когда я загружаю этот объект из своей базы данных через
$groups = $em->getRepository("orgGroup")->findAll();
Я просто получил имя правильно, но не _orgGroupType … и я не знаю, почему … OrgGroup является владельцем orgGroupType и его единственным ОДНОМ объектом, а не массивом. Мой веб-сервис всегда просто говорит:
{"error":[],"warning":[],"message":[],"data":[{"name":"AdministratorGroup","description":null,"_orgGroupType":{"__ isInitialized __":false}}]}
Результат:
"name":"AdministratorGroup", "description":null, "_orgGroupType":{"__ isInitialized __":false}
но должно быть:
"name":"AdministratorGroup", "description":"some description", "_orgGroupType":{name:"test"}
Итак, есть 2 ошибки … и я понятия не имею, почему. Все данные правильно установлены в базе данных.
Есть идеи?
EDIT: Вот недостающий код моего orgGroupType -entity
/** @Entity **/ class orgGroupType { /** * @OneToMany(targetEntity="orgGroup", mappedBy="_orgGroupType") **/ private $_orgGroups; public function __construct() { $this->_orgGroups = new ArrayCollection(); } }
Это выглядит как проблема с ленивой загрузкой. Как вы получаете данные из объекта в ответ на Webservice?
Doctrine2 lazy-load, если вы не настроили что-то еще, это означает, что ваши $groups = $em->getRepository("orgGroup")->findAll();
не возвратит реальные объекты orgGroup
, а объекты Proxy ( документация Doctrine ).
Это означает, что объект $group
не будет иметь его описание или значение orgGroupType, пока вы не вызовете $group->getDescription()
или $group->getOrgGroupType()
(тогда Doctrine загружает их автоматически), поэтому вам нужно сделать это, прежде чем писать данных в JSON-ответ для веб-службы. Он не будет работать, если вы каким-то образом пройдете через свойства объекта, не используя методы getter.
Надеюсь, это была проблема 🙂
Попробуйте изменить режим выборки. @ORM \ ManyToOne (targetEntity = "****", fetch = "EAGER"). Это сработало для меня.
Не забудьте инициализировать коллекцию orgGroups в объекте orgGroupType
/** * @OneToMany(targetEntity="orgGroup", mappedBy="_orgGroupType") */ protected $orgGroups ; public function __construct() { $this->orgGroups = new ArrayCollection(); }
Возможно, вам потребуется включить следующее в Entity
use Doctrine\Common\Collections\Collection, Doctrine\Common\Collections\ArrayCollection;