2011-03-18 97 views
1

辛苦的時間在我的頭上纏繞着。我有一個Page實體和一個關鍵字實體。我在我的Page實體中創建了一個名爲$ keywords的成員變量,該變量具有創建名爲「pages_keywords」的連接表的ManyToMany關聯。在我的應用程序中,我希望能夠爲頁面添加關鍵字。我將如何去添加該記錄到數據庫?學說2如何將記錄添加到沒有實體的連接表中?

我可以訪問Page實體的$關鍵字成員變量,但我不知道該從哪裏去。我看到ArrayCollection的Doctrine實現有一個add()方法,它只是一個值。我可以只傳遞關鍵字實體的ID併爲我創建記錄嗎?

回答

4

假設你知道你正在尋找與它關聯的實體的主鍵值(在您的示例中,$ keywordId),要做到這一點的最好辦法是讓對實體的引用。這樣可以在不爲相關實體執行數據庫查找的情況下爲您提供參考。

您在後續答案中發佈的解決方案具有需要額外訪問數據庫以檢索關鍵字記錄的缺點。檢索作爲參考意味着沒有額外的數據庫查詢:

<?php 

// assumes $this->em is already defined as the Doctrine2 EntityManager 
$page = $this->em->getRepository('App\Entity\Page')->find($pageId); 

// associate $keyword with $page via a reference to the keywordId 
$keyword = $this->em->getReference('App\Entity\Keyword', $keywordId); 
$page->getKeywords()->add($keyword); 
$em->flush(); 
+0

我真的很喜歡這種方法,需要開始使用它。 – 2011-04-27 15:50:43

1

由於某種原因,我似乎回答了很多我自己的問題。 :)

想出這一個。我只是抓住我想要添加到tha頁面的Page對象和Keyword對象,然後獲取關鍵字並使用傳遞給關鍵字對象的add()方法。

// Assuming you have an instance of the Entity Manager 
$page = $this->em->getRepository('App\Entity\Page')->find($pageId); 
$keyword= $this->em->getRepository('App\Entity\Keyword')->find($keywordId); 
$page->getKeywords()->add($keyword); 
$em->persist($page); 
$em->flush();  
+1

這是不好的,你是從數據庫中檢索實體,而實際上只需要一個參考吧。 $ em-> getReference是執行此操作的最佳方法。 – JCM 2011-07-08 13:48:45

+0

是的,我從那以後就知道了。看看接受的答案和我在那裏的評論。 – 2011-07-08 17:09:41