bboytiwst
@bboytiwst

Как сделать выборочное «подтягивание» сущностей в Doctrine2?

Есть 2 таблицы:
Articles, Comments

Связи:
Comments - ManyToOne - Articles
Articles - OneToMany - Comments
При выборке всех статей доктрина соответственно отдаёт мне и все комментарии.

Вопрос
Можно ли при написании самого запроса, ограничивать сущности которые будут подтягиваться? (при одном запросе подтянуть комментарии при другом нет)
или же для этого надо создавать отдельно репозиторий в котором описывать всё это дело с помощью DQL и только потом вызывать?
  • Вопрос задан
  • 2336 просмотров
Решения вопроса 2
BoneFletcher
@BoneFletcher
Комментарии подтягиваются из базы в тот момент, когда это требуется:
$article = $articleRepository->find(1); // SELECT * FROM Articles WHERE id=1
$comments = $article->getComments(); // здесь не происходит запросов к БД
foreach ($comments as $comment) { // SELECT * FROM Comments WHERE articleId=1
    echo $comment->getText();
}

Точно также в другую сторону:
$comment = $commentRepository->find(1); // SELECT * FROM Comments WHERE id=1
$article = $comment->getArticle(); // здесь не происходит запросов к БД
echo $article->getId(); // здесь тоже не происходит запросов к БД, вернет articleId комментария
echo $article->getName(); // SELECT * FROM Articles WHERE id=10
Ответ написан
Комментировать
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
А не LAZY / EXTRA_LAZY ли вас интересует?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
difiso
@difiso
В параллельной вселенной я космонавт
Оно есть/должно быть по умолчанию
symfony.com/doc/current/book/doctrine.html#fetchin... (заметка про Relationships and Proxy Classes)

Там пример
$product = $this->getDoctrine()
    ->getRepository('AcmeStoreBundle:Product')
    ->find($id);

$category = $product->getCategory();

// prints "Proxies\AcmeStoreBundleEntityCategoryProxy"
echo get_class($category);

This proxy object extends the true Category object, and looks and acts exactly like it. The difference is that, by using a proxy object, Doctrine can delay querying for the real Category data until you actually need that data (e.g. until you call $category->getName()).
Ответ написан
pavel_salauyou
@pavel_salauyou
Symfony2 & Angular разработчик
а как вы делаете выборку через DQL? или просто через find?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы