Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!

Symfony / Doctrine 2, как реализовать предварительную загрузку связей (одним запросом)?

Доброго времени суток уважаемые! Изучаю Doctrine2, реализовал Bidirectional-связь, как описано вот здесь.

Всё хорошо работает, но, меня смущает тот факт, что при каждом обращении к связи - Doctrine2 генерирует новый запрос, выбирая соответствующие данные.

Как реализовать автоматическую загрузку всех (данных) связей за 1 запрос?

То есть, заменить 50 запросов вида:
SELECT xxx FROM yyy WHERE zzz_id = 1, 2, 3 .. 50;

на 1 запрос вида:
SELECT xxx FROM yyy WHERE zzz_id IN (1, 2, 3, .. 50);


Я понимаю, что есть вариант реализовать нужную выборку через свои собственные методы в репозитории, но я уверен, что для такой банальной задачи должно быть решение уровня изменить/добавить 1 параметр, так же как это реализовано в других Фреймворках/ORM.

Спасибо.
  • Вопрос задан
  • 1457 просмотров
Решения вопроса 2
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Вам нужно выставить параметр fetch в значение "EAGER"
/**
 * @ORM\OneToOne(targetEntity="App\Post" , fetch="EAGER")
 */

либо
$query = $em->createQuery("SELECT u FROM App\User u");
$query->setFetchMode("App\User", "posts", \Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER);
$query->execute();
Ответ написан
Комментировать
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Три варианта:
- fetch=EAGER у связи (см. ответ @BoShurik)
- setFetchMode() у запроса (см. ответ @BoShurik)
- Указать конкретно JOIN в запросе

Первый вариант, естественно, хорош только тогда, когда загружать коллекцию нужно ВСЕГДА.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы