2015-11-05 112 views
1

我有一个Symfony2应用程序,其中包含Doctrine作为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,学说创建单独的查询为每个用户提取它的项目。

查询本身是很简单的:

$entities = $em->getRepository('AppUserBundle:User')->findBy([], [], 30); 

是否可以获取所有相关的项目在一个查询用户自动使用原则?

我使用SF 2.7.6和学说库与版本:

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

确保您清除缓存,并且已经显示映射文件是实际使用的一个。让你不混合yaml和注释。你发布的内容应该有效。 – Cerad

+0

我刚刚检查了所有这些,但仍然没有运气。 – miller

+0

只为咧嘴笑,尝试从您的查询中删除30。当涉及到连接时,限制和偏移总是有点困难。 – Cerad

回答

1

您可以创建一个method in the repository执行的连接,以避免额外的查询。可以用您自己的实现替换findBy方法,但我的首选是创建更具描述性的方法。

虽然Symfony文档中的示例使用DQL,但如果您愿意,也可以使用QueryBuilder

+1

我正在使用查询生成器,此问题中的查询仅用于简化,结果相同。 – miller

+0

如果您正在使用查询生成器,请发布查询。您将需要选择用户和项目。造成很大的差异。 – Cerad

1

我不认为设置渴望获取是一个好主意,无论如何tbh。

像这样的东西应该很好地工作:

$users = $this->getEntityManager() 
    ->createQueryBuilder()->select('u, i') // key is to select both entities 
    ->from('YourBundle:User', 'u') 
    ->join('u.item', 'i') 
    ->getQuery()->getResult(); 
+1

我已设法使用您的答案获取相关记录。它在技术上起作用,但会给数据带来很大的开销。假设我与用户实体有多个一对多关系,并且希望一次返回10000条记录,并且每个用户都有10个项目和10个帐户。如果我将使用JOIN方法,它将返回10000 * 10 * 10条记录。我宁愿如果教条可以使3个单独的查询来获取这些数据。 – miller