【发布时间】:2014-11-21 23:32:38
【问题描述】:
问题
强制原则从查询 JOIN 加载嵌套关联实体的最佳方法是什么?
详情
我有多个实体(view、contentType、version、settings),具有三个级别的关联:
view (primary entity)
contentType (ManyToOne joined on view.contentTypeId = contentType.id)
version (OneToMany joined on version.viewId = view.id)
settings (OneToOne joined on settings.versionId = version.id)
我有一个查询所有版本(不是视图)的列表,以获取最近修改的版本。但我从view 和contentType 和settings 访问属性。我通过view 访问contentType(所以它有两层深)。当我在循环中引用这些属性时,我不希望 Doctrine Lazy Loading 每个值,每个循环都有 N 个查询。
所以我在查询中加入实体,并选择所有字段。
$versionRepo = $em->getRepository('GutensiteCmsBundle:View\ViewVersion');
$queryBuilder = $versionRepo->createQueryBuilder('e')
->join('e.view', 'view')
->addSelect('view')
->join('view.contentType', 'contentType')
->addSelect('contentType')
->join('e.settings', 'settings')
->where('e.siteId = :siteid')->setParameter('siteId', 1)
->setMaxLimit(25);
第一级链接被正确获取,例如version.view。但是,学说处理 version.settings 就像延迟加载一样,我将有 25 个额外的查询来加载每个单独的值。
所以即使我加入了settings,它仍然是延迟加载。
【问题讨论】:
标签: symfony doctrine-orm doctrine