为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
呼如林 2023-09-22 17:52:59
我在一个需要来自多个表的数据的项目中使用 Doctrine。为了避免 N + 1 问题,我在进入视图之前获取我需要的所有数据。正如我在文档中看到的,执行此操作的方法是与表进行联接,然后使用联接表的别名调用 addSelect。问题是,当我构建所需的查询并调用 getResult 时,Doctrine 返回实体对象和连接实体的代理的集合,这会在视图中的数组迭代期间导致问题,因为代理没有与实体对象具有相同的属性。我对这种行为真的很困惑。你能帮我解决这个问题吗?
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

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


@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();

    }

}

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


查看完整回答
反对 回复 2023-09-22
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信