Doctrine对一对多关系进行了许多查询

时间:2015-11-05 21:33:02

标签: php symfony doctrine-orm doctrine

我有一个带有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

2 个答案:

答案 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();