Million ManyToMany条目 - 内存问题

时间:2013-05-14 13:51:54

标签: symfony doctrine-orm doctrine many-to-many limit

我开发了一种“统计网络”。

例如,我有一些博客条目,每个访问者都有一个额外的统计条目。

博客实体示例:

/**
 * @ORM\ManyToMany(targetEntity="Statistic", inversedBy="blogid")
 * @ORM\JoinTable(name="blog_statistics")
 */
private $statistics;

示例统计实体:

/**
 * @ORM\ManyToMany(targetEntity="Blog", mappedBy="statistics")
 */
private $blog;

在统计实体中,我有更多字段,如“时间,用户,IP”。 在博客实体中,我有“文本,标题,时间”等字段。

一开始我有一个条目。 一切都很好。

一周后,我有2个博客条目的5.000个条目(DB)。 (每篇博客2.500) 我得到了php内存问题。

我认为doctrine会尝试将所有2.500个条目加载到RAM / Cache中。 但我只需要最后一个用于“最后访问”的信息。 如果我需要,我可以获得其余的条目。 (统计概览)

最好“限制”条目? 当前通话:“Repository-> fetchAll”

2 个答案:

答案 0 :(得分:0)

解决方案非常明显:

$lastStatisticsRecord = $repository->createQueryBuilder('s')
        ->orderBy('s.time', 'DESC')
        ->setMaxResults(1)
        ->getQuery()
        ->execute();

此查询将仅从表中选择最后一个统计实体。 如果您需要获取包含最后一个统计条目的博客条目,只需创建一个JOIN语句:

 $lastStatisticsRecord = $repository->createQueryBuilder('s')
        ->select(array('s', 'b'))
        ->leftJoin('s.blogid', 'b')
        ->orderBy('s.time', 'DESC')
        ->setMaxResults(1)
        ->getQuery()
        ->execute();

答案 1 :(得分:0)

问题解决了......

仅在多对多关系中使用“fetch”选项:

@ORM\ManyToMany(targetEntity="Statistic", inversedBy="blogid", fetch="EXTRA_LAZY")

然后您可以使用此功能获取最新的统计条目:

public function getLatestStatistic()
{
    $cur = array();
    if(count($this->getStatistics()) > 0)
    {
        $cur = $this->getStatistics()->slice(count($this->getStatistics()) - 1, 1);
    }
    return count($cur) > 0 ? $cur[0] : null;
}