Jos*_*hua 5 php symfony doctrine-orm
当我在 Doctrine 中执行这样的事情时:
$qb = $doctrine
->getRepository('EntityA')
->createQueryBuilder('a')
->addSelect('b')
->join('EntityB', 'b', 'WITH', 'a.b = b')
->getQuery()
->getResult()
Run Code Online (Sandbox Code Playgroud)
我得到一个看起来像这样的数组:
array(0 => EntityA,
1 => EntityB,
2 => EntityA,
4 => EntityB)
Run Code Online (Sandbox Code Playgroud)
事实上,我得到了 2 个结果行,但是一个大小为 4 的数组。这使得迭代它以在模板中显示几乎是不可能的。
我想要这样的结果:
array(0 => array(EntityA, EntityB),
1 => array(EntityA, EntityB))
Run Code Online (Sandbox Code Playgroud)
当然,我可以在EntityA
该引用上创建映射EntityB
。但即使有改变的装载行为的可能性LAZY
,EAGER
等等,也可能是希望具有动态创建这种关系的可能性。
例如:
在包含大量实体的概览中,EAGER
需要加载以防止过多的查询。但是当我只想显示一个实体并且不需要额外的数据时,延迟加载更可取。
由于您已EntityB
映射为EntityA.b
,如以下关系所示:
...join('EntityB', 'b', 'WITH', 'a.b = b')...
Run Code Online (Sandbox Code Playgroud)
因此,您实际上不需要添加b
到选择,因为您正在急切或延迟加载它。
->addSelect('b')
从查询生成器中删除并EntityB
通过映射使用EntityA.b
。
例子:
$as = $doctrine
->getRepository('EntityA')
->createQueryBuilder('a')
->join('EntityB', 'b', 'WITH', 'a.b = b')
->getQuery()
->getResult();
foreach($as as $a){
echo "EntityA property".$a->id;
echo "EntityB property".$a->b->id;
}
Run Code Online (Sandbox Code Playgroud)
该查询将返回一个ArrayCollection
of EntityA
。
注意:上面的示例假设它EntityA.b
是公共财产。
更新:
经过一番挖掘,我发现了这篇旧文章:Doctrine 2 QueryBuilder add multiple select elements /parameters? 。根据它,您可以通过直接用逗号分隔实体而不是使用该->addSelect()
方法来获得您想要的结果。
尝试以下 DQL:
$query = $em->createQuery("SELECT a, b FROM EntityA a JOIN a.b b")
Run Code Online (Sandbox Code Playgroud)
上面的查询将动态地急切地获取b
。