如何解决如何迭代与代理和对象混合的Doctrine集合
我在需要多个表中数据的项目中使用Doctrine。为了逃避N + 1问题,我需要获取所有数据,然后再将其发送到视图。正如我在文档中所看到的,执行此操作的方法是与表进行联接,然后使用已联接表的别名调用addSelect。问题是,当我构建所需的查询并调用getResult时,Doctrine会向我返回实体对象和所连接实体的代理的集合,这会在视图中的数组迭代期间引起问题,因为代理没有与实体对象相同的属性。我真的对这种行为感到困惑。您能帮我解决这个问题吗?
解决方法
您获得了代理对象,因为它们是延迟加载的,这是正确的。您不应该对它们有任何问题,因为当您遍历集合时,所有数据都应正确设置。代理的行为通常类似于完全加载的实体。如果您遇到问题,也许问题就在其他地方。但是,您可以在关系中将抓取设置为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();
您还可以在迭代期间自行加载代理对象。像这样
forach($collection as $object) {
if ($proxy instanceof Doctrine\ORM\Proxy\Proxy) {
$proxyObject->__load();
}
}
但是您可以发布代码(实体,从存储库和视图部分进行查询),因为代理应该没有任何问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。