2015-08-26 171 views
6

我有一個多對多關係,當我加載一個這個關係的一邊的實體時,我期望看到它的屬性另一側的相關實體的ArrayCollection。然而,這不會發生 - ArrayCollection加載沒有元素,而在數據庫中,我可以看到相關的條目。可能是什麼原因?Symfony2:學說不會加載多對多關係的相關實體

這裏是我的代碼:關係的
一面,ConsolidatedReport類:

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="P24\Response", inversedBy="consolidatedReports") 
* @ORM\JoinTable(name="con_rprt_responses") 
*/ 
private $responses; 

關係的另一面,Response類:

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="P24\ConsolidatedReport\ConsolidatedReport", mappedBy="responses") 
*/ 
private $consolidatedReports; 

這是我跑的功能獲取ConsolidatedReport的一個實例。該功能位於一個正在被從容器調用服務中:

/** 
* Picks the consolidated report with given id. 
* 
* @param string $id 
* 
* @return ConsolidatedReport 
* 
* @throws NonExistentConsolidatedReportException if the survey doesn't exist 
*/ 
public function pick($id) 
{ 
    $report = $this->repository->findOneBy(array('id' => $id)); 

    if (!$report) { 
     throw new NonExistentConsolidatedReportException($id); 
    } 

    return $report; 
}' 

在數據庫中,有「con_rprt_responses」表有兩列「consolidated_reports_id」和「RESPONSE_ID」。但是,在剖析器中,我沒有看到該表的任何查詢。

這裏可能會出現什麼問題?

更新: 請看我對下面這個問題的回答,那對我有用。

+0

在分析器中,我看不到任何對「con_rpt_responses」表的查詢。 – Vasily802

回答

5

我加fetch="EAGER"到ConsolidatedReport類的$響應特性,和它的工作。

現在,該代碼如下所示:

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="P24\Response", inversedBy="consolidatedReports", fetch="EAGER") 
* @ORM\JoinTable(name="con_rprt_responses") 
*/ 
private $responses; 

此處瞭解詳情: http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#by-eager-loading

不過,如果有人知道這是爲什麼相關實體的集合不會沒有明確指定EAGER取加載 - 請分享你的知識,非常感謝!

+0

我遇到了一對多關係的相同問題,'fetch =「EAGER」'也解決了它。這很奇怪。你有沒有想過爲什麼渴望提取是必需的? –

0

如果您指定joinColumns,這是否解決您的問題?

/** 
* @ORM\ManyToMany(targetEntity="P24\Response", inversedBy="consolidatedReports") 
* @ORM\JoinTable(name="con_rprt_responses", 
* joinColumns={@ORM\JoinColumn(name="consolidated_reports_id", referencedColumnName="id")}, 
* inverseJoinColumns={@ORM\JoinColumn(name="response_id", referencedColumnName="id")} 
*) 
*/ 
+0

nope,它不是 – Vasily802

0

* toMany屬性必須用ArrayCollection進行初始化。

public function __construct() { 
    $this->responses = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this-> consolidatedReports = new \Doctrine\Common\Collections\ArrayCollection(); 
} 
+0

是的,這是指定的 – Vasily802

0

如果您有更多的然後單查詢獲取使用Doctrine嘗試使用相同的對象:

$entityManager->clear(); 
之間

,來解決「失蹤」的實體。它不是「按原樣」的解決方案,但是可以給你一個想法鏈中的錯誤的想法。