2013-05-14 49 views
0

我开发了一种“Statistics-Web”。百万ManyToMany条目 - 内存问题

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

例博客实体:

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

实施例的统计的实体:

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

在用于统计的实体我有更喜欢 “时间,用户,IP” 字段。 在Blog实体中,我有“文本,标题,时间”等字段。

在开始时我有1个条目。 一切正常/良好。

一个星期后,我有两个博客作品5.000条目(DB)。 (每个博客条目2.500) 我得到php内存问题。

我认为学说试图加载所有2.500条目到RAM/Cache中。 但是我只需要最后一次为“上次访问”信息。 如果我需要他们,我可以得到剩下的条目。 (统计概览)

什么是最好的“限制”条目? 当前呼叫:“Repository->使用fetchall”

+0

直接在你的查询中排序和限制,所以只有你搜索的行被水化成php对象。 – 2013-05-14 14:01:08

+0

我有2个条目......或者你的意思是像@ORM \ Limit(1) – Patrick 2013-05-14 14:48:16

+0

这样的注释你可以发布更多的代码,在哪里调用你的fetchAll和哪个repo? – 2013-05-14 14:52:06

回答

0

问题解决了...

仅使用在许多-TO-“提取”选项许多关系:

@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; 
} 
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(); 
+0

好的。如果我使用你的代码,我必须删除“私人$统计数字”;来自实体。对? 或者不加载QueryBuilder的ManyToMany连接? 那就是完美:) – Patrick 2013-05-14 18:38:14

+0

不,请留下你的关系描述,因为它是现在,只是使用我提供的查询;) – 2013-05-18 18:46:18