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)
该查询将返回一个ArrayCollectionof 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。