0

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

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

示例博客实体:

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

示例统计实体:

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

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

一开始我有1个条目。一切正常/很好。

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

我认为教义试图将所有 2.500 条目加载到 RAM/缓存中。但我只需要最后一个来获取“上次访问”信息。如果我需要的话,我可以得到其余的条目。(统计概览)

什么是最好的“限制”条目? 当前调用:“Repository->fetchAll”

4

2 回答 2

0

问题解决了...

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

@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;
}
于 2013-05-18T21:42:19.967 回答
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();
于 2013-05-14T14:59:50.237 回答