2012-08-17 63 views
10

的關係,我有這樣的代碼原則2不堅持從擁有側一對多

// ONE to many Bidir -- inverse side 
    /** 
    * @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"}) 
    **/ 
    protected $items; 

對方

// ONE to many Bidir-- own side 
    /** 
    * @ORM\ManyToOne(targetEntity="Room", inversedBy="items") 
    * @ORM\JoinColumn(name="room_id", referencedColumnName="id") 
    **/ 
    protected $room; 

我的問題是,我去項目頁面,我選擇房間,那麼我可以看到項目preselecetd在房間頁面

但是,如果我去房間頁面,我嘗試多選幾項,那麼這些都不會持續

編輯:我已經看到,它只發生OneToMany關係船。對於Manyto很多,他們正在努力罰款

EDIT2:

我講的後端的面積在那裏我有形式和選擇框在那裏我可以選擇多個項目。這種形式/ CRUD代碼/控制器由原則生成。所以我不需要添加任何額外的功能。無論如何,這是我的控制器代碼

$editForm = $this->createForm(new RoomType(), $entity); 


     $request = $this->getRequest(); 

     $editForm->bindRequest($request); 
     if ($editForm->isValid()) { 
      $em->persist($entity); 
      $em->flush(); 

當我嘗試在控制器穿行這樣

foreach($entity->getItems() as $item) 
     echo $item; 

那麼我可以看到所有的泰豐項目出現。所以它意味着所有物品都存在於主要物品中,但它不會持續它們。我不知道爲什麼。

如果有欠款,反面問題。我如何能夠通過反向擁有

+1

不知道你的代碼是什麼樣的,或者你的數據庫,一些例子會有用。 – Asciiom 2012-08-17 08:30:37

回答

10

根據您在註釋中的意見,您的代碼是錯誤的。

這是擁有側,因爲您指定的inversedBy屬性:

/** 
* ONE to many Bidir-- Inverse side 
* @ORM\ManyToOne(targetEntity="Room", inversedBy="items") 
* @ORM\JoinColumn(name="room_id", referencedColumnName="id") 
**/ 
protected $room; 

這是反側(因爲它有mappedBy屬性):

/** 
* ONE to many Bidir -- owning side 
* @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"}) 
**/ 
protected $items; 

所以你的代碼說:Item是擁有方,Room是反面。

擁有的雙向關係側必須由OneToOne的inversedBy屬性, 多對一,或多對多映射聲明的使用指其 逆側。 inversedBy屬性 指定實體中與 關係的反面相對的字段。

爲了使它更乾淨:

擁有方必須使用OneToOne, 多對一,或者多對多映射聲明的inversedBy屬性。inversedBy屬性 包含反面的關聯字段的名稱。

雖然爲了逆側:

的雙向關係的逆側必須引用其 持有端通過使用的mappedBy的OneToOne, 的屬性 OneToMany或ManyToMany映射聲明。 mappedBy屬性 指定作爲 關係所有者的實體中的字段。

並且,再次:

逆側具有使用OneToOne, 一對多,或多對多映射聲明的屬性的mappedBy。 mappedBy屬性 包含擁有端的關聯字段的名稱。

此外,另一個重要的考慮因素:

多對一始終是一個雙向ASSOCATION的擁有方。

一對多始終是一個雙向ASSOCATION的逆側

因此,從逆側(室)持續的項目,你必須檢查哪些項目已被選擇/取消,如果房間已經包含了項目與否。

+2

我可能錯在說哪邊是擁有和反轉,但代碼應該在兩個方向工作。我在每一方面和兩方面都堅持不懈地堅持下去,但它並沒有奏效。即使你沒有那個房間的物品,我選擇了5個物品,數據庫中沒有任何東西。而這正在發生一個班級。所以我想我需要在我的代碼中添加一些與之相反的內容。我的代碼是否正常,無論擁有什麼和反面 – user825904 2012-08-17 10:47:51

3

只需使用您的循環來設置房間。項目是欠方和你編輯反面(房間)。 Symfony2從不更新負面,而編輯反面。

你最簡單的辦法是堅持室前使用循環:在反側

foreach($entity->getItems() as $item){ 
    $item->setRoom($room); 
} 

和級聯:

/** 
* @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"}) 
**/ 
protected $items; 

爲我的項目我做了基於收集事件偵聽器,可重複使用的解決方案。 如果你有時間&技能我鼓勵你這樣做

+0

我想我也需要在循環中堅持項目。你在說哪個收藏活動,你能給我提供參考或任何鏈接。 – user825904 2012-08-22 00:37:33

+0

如果你在反面有級聯,你不必堅持他們。如果您在保存所有對象數據之前得到它,但沒有父級空間。 – 2012-08-22 12:33:07

+0

閱讀關於表單事件:http:// stackoverflow。com/questions/9651095/symfony2-form-events的描述,集合只是表單嵌入項目 – 2012-08-22 12:37:45