[英]How to iterate over Doctrine collection mixed with Proxies and Objects
我在需要来自多个表的数据的项目中使用 Doctrine。 为了摆脱 N + 1 问题,我正在获取所有数据,我需要在 go 到视图之前。 正如我在文档中看到的那样,执行此操作的方法是与表进行连接,然后使用连接表的别名调用 addSelect。 问题是,当我构建我需要的查询并调用 getResult 时,Doctrine 返回我实体对象和连接实体的代理的集合,这会在视图中数组的迭代过程中导致问题,因为代理没有与实体对象相同的属性。 我真的对这种行为感到困惑。 你能帮我解决这个问题吗?
您会得到代理对象,因为它们是延迟加载的,这是正确的。 你不应该对它们有任何问题,因为当你迭代集合时,所有数据都应该正确设置。 代理通常表现得像完全加载的实体。 如果你有问题,也许问题出在其他地方。 但是,您可以在关系中将 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();
您也可以在迭代过程中自行加载代理 object。 类似的东西
foreach($collection as $object) {
if ($object instanceof Doctrine\ORM\Proxy\Proxy) {
$object->__load();
}
}
但是,您可以发布您的代码(实体、来自存储库的查询和视图部分),因为代理不应该有任何问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.