【问题标题】:Assign multiple distinct Entities to one Array row in Doctrine将多个不同的实体分配给 Doctrine 中的一个数组行
【发布时间】:2015-07-28 10:35:14
【问题描述】:

当我在 Doctrine 中执行这样的操作时:

$qb = $doctrine
  ->getRepository('EntityA')
  ->createQueryBuilder('a')
  ->addSelect('b')
  ->join('EntityB', 'b', 'WITH', 'a.b = b')
  ->getQuery()
  ->getResult()

我得到一个如下所示的数组:

array(0 => EntityA,
      1 => EntityB,
      2 => EntityA,
      4 => EntityB)

事实上,我得到了 2 个结果行,但是一个大小为 4 的数组。这使得迭代它以在模板中显示几乎是不可能的。

我想要这样的结果:

array(0 => array(EntityA, EntityB),
      1 => array(EntityA, EntityB))

当然,我可以在 EntityA 上创建一个引用 EntityB 的映射。但即使有可能改变加载行为,LAZYEAGER 等,也可能希望有可能在运行中创建这样的关系。

例如:

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

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    由于您将EntityB 映射为EntityA.b,如下关系所示:

    ...join('EntityB', 'b', 'WITH', 'a.b = b')...
    

    因此,您实际上不需要将b 添加到选择中,因为您正在加载它急切懒惰

    从您的查询构建器中删除 ->addSelect('b') 并在您的 EntityA.b 映射中使用 EntityB

    示例:

    $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;
    }
    

    此查询将返回 ArrayCollectionEntityA

    注意:上面的例子假设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")
    

    上面的查询将动态地急切地获取b

    【讨论】:

    • 所以我仍然将EntityB 映射到A,例如通过注释,懒惰地。通过手动加入,我模仿了急切的抓取? Doctrine 识别获取的数据并将其设置为EntityA 上的相应字段?那会很整洁......
    • @Joshua 实际上在研究了更多主题后发现我错了。根据官方文档:A join (be it an inner or outer join) becomes a “fetch join” as soon as fields of the joined entity appear in the SELECT part of the DQL query outside of an aggregate function. Otherwise its a “regular join”.
    • @Joshua 我今天将对该主题进行更多研究并提出不同的解决方案。
    • 非常感谢您的努力。不幸的是,您的建议会导致所描述的行为,即包含交替实体的数组。我想当前版本的 Doctrine 不支持我的想法。
    猜你喜欢
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多