Как получить объект со всеми его ассоциациями с помощью EntityManager в Doctrine2?

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

Как я могу получить объект со всеми его ассоциациями с помощью EntityManager в Doctrine2? например:

$this->em
     ->getRepository('EntitiesPatientprofile')
     ->findOneByuserid('555555557')
     ->fetchAllAssociations();

4 ответов


доктрина 2 использует прокси-классы для ленивой загрузки, поэтому вам не нужно получать данные ассоциаций, пока вы не используете объекты. Поскольку прокси-классы наследуются от ваших классов ассоциаций, вы можете использовать прокси точно так же, как вы бы использовали классы ассоциаций fretch.

но если вам действительно нужно получить фактические классы ассоциаций, вам нужно сообщить запросу, чтобы установить режим выборки в Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER. Если вы используя аннотации, вы можете достичь этого с помощью:

например

/**
 * @ManyToMany(targetEntity="Item", fetch="EAGER")
 */
private $items;

от http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql

вы можете установить готовностью выбрать режим временно:

$query = $em->createQuery("SELECT u FROM MyProject\User u");
$query->setFetchMode("MyProject\User", "address", "EAGER");
$query->execute();

если вы хотите динамически загружать все ассоциации с этим режимом выборки, вы можете использовать getAssociationMappings() метод Doctrine\ORM\Mapping\ClassMetadataInfo, передавая имя вашей сущности в качестве параметра конструктору ClassMetadataInfo и затем перебрать возвращенный массив как $assoc и звонок:

$query->setFetchMode("MyProject\User", $assoc, "EAGER");

Doc: ClassMetadataInfo#getAssociationMappings ()


Doctrine2 setFetchMode не работает с "нетерпеливым"

я также попытался получить ассоциирующие объекты "с нетерпением", используя setFetchMode в моем запросе, но следующее, похоже, не сработало:

$query->setFetchMode("MyProject\User", "address", "EAGER");

когда я прыгнул в файлы я узнал, что третий параметр $fetchMode должно быть целым числом. Константы определены в Doctrine\ORM\Mapping:ClassMetadataInfo. При передаче строки по умолчанию используется значение Mapping\ClassMetadata::FETCH_LAZY из-за этого если пункт.

/**
 * Specifies that an association is to be fetched when it is first accessed.
 */
const FETCH_LAZY = 2;

/**
 * Specifies that an association is to be fetched when the owner of the
 * association is fetched.
 */
const FETCH_EAGER = 3;

/**
 * Specifies that an association is to be fetched lazy (on first access) and that
 * commands such as Collection#count, Collection#slice are issued directly against
 * the database if the collection is not yet initialized.
 */
const FETCH_EXTRA_LAZY = 4;

таким образом, установка соответствующего целого числа решила проблему:

$query->setFetchMode("MyProject\User", "address", 3);

или объявить класс use Doctrine\ORM\Mapping\ClassMetadata вверху, а затем использовать константу:

$query->setFetchMode("MyProject\User", "address", ClassMetadata::FETCH_EAGER);

вы можете использовать запрос DQL:

$query = $em->createQuery("SELECT p, f FROM Entities\Patientprofile p JOIN p.Foo f WHERE p.id = ?1");
$query->setParameter(1, 321);
$patient = $query->getSingleResult();