我开发了一种“统计网络”。
例如,我有一些博客条目,每个访问者都有一个额外的统计条目。
博客实体示例:
/**
* @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”
答案 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;
}