2013-05-14 48 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