Доктрина 2 Ленивая загрузка не удалась - PullRequest
5 голосов
/ 24 апреля 2011

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

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

Если я дам данные, подобные этим \Doctrine\Common\Utils\Debug::log($user->client);, он выведет клиентский прокси с его идентификатором клиента.

Если я изменю политику выборки на «EAGER»«Я получу клиентскую сущность неповрежденной, но мне не всегда нужна клиентская сущность, когда я получаю доступ к пользователям, поэтому я скорее предпочитаю использовать LAZY-загрузку, если это возможно.

EDIT

Когда я позже сделаю это:

$user->client->name

Я получу нулевое значение, даже если мой прокси-сервер получил идентификатор клиента.

Это мои два отношения (внутри аннотации):

// user annotation

/**
 * @var Entities\Client
 *
 * @ManyToOne(targetEntity="Client", inversedBy="users", fetch="LAZY")
 */
private $client;

// client annotation

/**
 * @var Entities\User
 *
 * @OneToMany(targetEntity="User", mappedBy="client", cascade={"all"}, fetch="LAZY")
 */
private $users;

РЕДАКТИРОВАТЬ

Я выяснил, почему это не сработало, все мои аннотации расширяли базовую аннотацию, тогда базовая аннотация имела геттер иустановщик, который потерпел неудачу при использовании в прокси-классе.

1 Ответ

6 голосов
/ 08 июня 2012

Вы никогда не должны определять свойства, отображаемые в Doctrine, как публичные.Вместо этого вы всегда должны определять их как защищенные или частные, а затем обращаться к ним с помощью методов получения и установки.Таким образом, Doctrine может определить прокси-класс, который «переопределяет» эти методы получения и установки (таким образом, разрешая отложенную загрузку).

Если вы обращаетесь к свойству напрямую (как вы делали в $user->client->name), Doctrine не имеетспособ перехватить этот вызов.

...