我有一个带有Doctrine的Symfony2应用程序作为ORM。在我的应用程序中,我有两个具有一对多关系的实体。一个实体是User
,许多实体是Item
。他们的关系配置如下:
用户:
oneToMany:
items:
targetEntity: App\Bundle\ItemBundle\Entity\Item
fetch: EAGER
mappedBy: user
档案:
manyToOne:
user:
targetEntity: App\Bundle\UserBundle\Entity\User
fetch: EAGER
inversedBy: items
joinColumn:
name: user_id
referencedColumnName: id
问题是,当我试图获取Users
及其Items
列表时,Doctrine会为每个用户创建单独的查询以获取其项目。
查询本身非常简单:
$entities = $em->getRepository('AppUserBundle:User')->findBy([], [], 30);
是否可以使用Doctrine自动为一个查询中的用户获取所有相关项目?
我使用SF 2.7.6和doctrine libs版本:
doctrine/annotations v1.2.7 Docblock Annotations Parser
doctrine/cache v1.5.1 Caching library offering an ob...
doctrine/collections v1.3.0 Collections Abstraction library
doctrine/common v2.5.1 Common Library for Doctrine pr...
doctrine/dbal v2.5.2 Database Abstraction Layer
doctrine/doctrine-bundle 1.6.0 Symfony DoctrineBundle
doctrine/doctrine-cache-bundle 1.2.1 Symfony Bundle for Doctrine Cache
doctrine/doctrine-migrations-bundle 1.1.1 Symfony DoctrineMigrationsBundle
doctrine/inflector v1.0.1 Common String Manipulations wi...
doctrine/instantiator 1.0.5 A small, lightweight utility t...
doctrine/lexer v1.0.1 Base library for a lexer that ...
doctrine/migrations v1.1.0 Database Schema migrations usi...
doctrine/orm v2.5.1 Object-Relational-Mapper for PHP
答案 0 :(得分:1)
您可以创建执行联接的method in the repository以避免其他查询。可以用您自己的实现替换findBy
方法,但我更喜欢创建更具描述性的方法。
虽然Symfony文档中的示例使用DQL,但如果您愿意,可以使用QueryBuilder
。
答案 1 :(得分:1)
我不认为设置热切的提取无论如何都是个好主意。
这样的事应该可以正常工作:
$users = $this->getEntityManager()
->createQueryBuilder()->select('u, i') // key is to select both entities
->from('YourBundle:User', 'u')
->join('u.item', 'i')
->getQuery()->getResult();