【问题标题】:Doctrine/Symfony 2: Entities with too many relationshipsDoctrine/Symfony 2:具有太多关系的实体
【发布时间】:2012-08-09 07:00:51
【问题描述】:

我正在处理来自 Doctrine 查询的实体对象,我最终得到了一个非常大的数组,其中包含来自所有相关实体的所有信息。这最终成为一个巨大的数据树......我该如何限制呢?避免列出所有关系中的所有数据?

【问题讨论】:

  • 我不知道它是否有帮助,但您可以尝试在查询结束时执行->getResult(Doctrine\ORM\Query::HYDRATE_ARRAY),结果将作为数组返回

标签: php symfony doctrine


【解决方案1】:

您始终可以删除不需要的关联(这是加速 Doctrine 的最佳做法)。或者您可以在表示层中仅选择您需要的字段(作为只读数据):

public function getAll()
{
    $qb = $this->createQueryBuilder('u'); // Where are in User custom repository

    return $qb
        ->select(array('u.id', 'u.first', 'u.last'))
        ->getQuery()
            ->getResult();
}

如果您仍需要处理对象(或对于需要纯 SQL 的复杂查询),则可能只填充域对象所需的属性(最终,关联/嵌套集合)。

一个例子,更多关于native SQL

public function getAll()
{
    $mapping = new \Doctrine\ORM\Query\ResultSetMapping();

    $mapping->addEntityResult('Acme\HelloBundle\User', 'e');

    $mapping->addFieldResult('e', 'id', 'id');
    $mapping->addFieldResult('e', 'first', 'first');
    $mapping->addFieldResult('e', 'last', 'last');

    $sql = "SELECT id, first, last FROM user ";

    $result = $this->_em->createNativeQuery($sql, $mapping)->getResult();

    // Or hust return $result itself (array)
    return new \Doctrine\Common\Collections\ArrayCollection($result);
}

当然,缺点(?)是使用原生 SQL。我不相信 ResultSetMapping 可以与 DQL 一起使用。

编辑:看看http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/best-practices.html

【讨论】:

  • 我正在寻找一种简单的方法来禁用 Doctrine 中的延迟加载,或者获得最大的关系深度。有可能吗?
  • @vinnylinux 如果我没记错的话,延迟加载是当您选择数据子集,然后,当访问未加载的属性或关联时,学说将为您加载(在附加查询中)所有数据.所以延迟加载是一件好事。正如我所说,这取决于。数据有什么用途?
  • 当您使用 JMSSerializer bundle 之类的东西序列化数据时,这绝对不是一件好事。使用具有各种关系的相当大的数据集来测试自己。它开始递归了。
  • @vinnylinux 从来没有使用过那个包,我相信你。不能简单地只获取需要的字段吗?
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2023-04-10
  • 2014-09-30
相关资源
最近更新 更多