Doctrine 2 OneToOne сопоставление сущностей возвращает пустые сущности - PullRequest
2 голосов
/ 06 августа 2011

Настройка:

У меня есть следующий код двух моделей сущностей:

Учетная запись, представляющая учетную запись пользователя и имеющая внешний ключ от класса.

<?php
namespace models;

/**
 * @Entity
 */
class Account
{
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @OneToOne(targetEntity="Classroom")
     */
    public $classroom;
}

Класс, представляющий класс, в который зачислен студент.

<?php
namespace models;

/**
 * @Entity
 */
class Classroom
{
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @Column(type="string")
     */
    public $name;
}

Проблема:

Когда я делаю $account = $em->find('Account',$id);, я правильно получаю учетную запись из базы данных, но $account->classroom; является пустым (не нулевым) объектом. Немного поэкспериментировав, я попытался добавить перед выполнением следующую команду:

$em->getRepository('Classroom')->findAll().

Затем я выполнил $em->find('Account', $id ); и классный объект внутри объекта учетной записи вернулся правильно.

Спекуляция:

Я предполагаю, что что-то не так с тем, как объекты загружаются и кэшируются из базы данных, потому что, если я загружаю все объекты класса (или объект, связанный с учетной записью I) до того, как я выполню find(), тогда все в порядке.

Поскольку я новичок в PHP и Doctrine, я ищу дальнейшие мнения / помощь для решения этой проблемы.

1 Ответ

4 голосов
/ 05 сентября 2011

Из документации по архитектуре доктрины :

Все постоянные свойства / поля любого класса сущностей всегда должны быть частными или защищенными , иначе отложенная загрузка может работать не так, как ожидалось .

Ваше свойство $classroom имеет значение public, поэтому, вероятно, ассоциация с объектом Classroom загружается не с отложенной загрузкой. Вы должны изменить его на private или protected (я рекомендую сделать все ваши свойства сущности protected, по различным причинам ).

Если это не сработает, вы можете попробовать установить атрибут fetch вашей OneToOne ассоциации на EAGER, то есть

/**
 * @OneToOne(targetEntity="Classroom", fetch="EAGER")
 */
protected $classroom;
...