如何迭代与代理和对象混合的 Doctrine 集合

How to iterate over Doctrine collection mixed with Proxies and Objects

我在需要来自多个 table 的数据的项目中使用 Doctrine。为了避免 N + 1 问题,我正在获取所有需要的数据,然后再进入视图。正如我在文档中看到的那样,执行此操作的方法是使用 tables 进行连接,然后使用连接的 table 的别名调用 addSelect。问题是,当我构建我需要的查询并调用 getResult 时,Doctrine returns me 实体对象和连接实体的代理的集合,这会在视图中的数组迭代期间导致问题,因为代理不具有与实体对象相同的属性。我真的很困惑这种行为。你能帮我解决这个问题吗?

您获得代理对象是因为它们是延迟加载的,这是正确的。你不应该对它们有任何问题,因为当你迭代收集时,所有数据都应该正确设置。代理通常表现得像满载的实体。如果你有问题,也许问题出在别处。但是,您可以在关系中将 fetch 设置为 EAGER 以强制构建完整实体。

@ManyToOne(targetEntity="target", fetch="EAGER")
@JoinColumn(name="target", referencedColumnName="id")

此外,您还可以使用 $query->getResult(Doctrine\ORM\Query::HYDRATE_ARRAY); 来组合查询中的所有对象。你也可以试试$queryBuilder->getQuery()->setHint (Query::HINT_FORCE_PARTIAL_LOAD, true)->get();

您也可以在迭代过程中自行加载代理对象。类似的东西

foreach($collection as $object) {
    if ($object instanceof Doctrine\ORM\Proxy\Proxy) {
        $object->__load();
    }
}

但是您可以 post 您的代码(实体、来自存储库的查询和视图部分),因为代理不应该有任何问题。