将多个不同的实体分配给 Doctrine 中的一个数组行

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。但即使有改变的装载行为的可能性LAZYEAGER等等,也可能是希望具有动态创建这种关系的可能性。

例如:

在包含大量实体的概览中,EAGER需要加载以防止过多的查询。但是当我只想显示一个实体并且不需要额外的数据时,延迟加载更可取。

Mar*_*ark 0

由于您已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