2016-08-23 46 views
0

讓我們想象一下這2個實體:形式 - 管理一對多集合元素

ShoppingCart 
    creationDate 

Item 
    name 
    shoppingCart # ManyToOne 

我管理ShoppingCart的形式與Items

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    // ... 
    $builder 
    // ... 
     ->add('items', CollectionType::class, array(
      'entry_type' => ItemFormType::class, 
    // ... 
} 

一個CollectionType我想我的用戶能夠添加/刪除項目,這對我來說似乎是一個相當普遍的需求。

如果我沒理解好,這裏是我必須做的:

  • 定義ShoppingCart關係的反向OneToManyItem
  • 確保這種關係有cascade={"persist"}orphanRemoval=true選項
  • 將此項Collection初始化爲構造函數
  • allow_addallow_delete表單選項設置爲真正
  • by_reference形式選項
  • 確保andItem() & removeItem()功能被實現爲ShoppingCart
  • 設置/取消擁有方關係除了添加ShoppingCart /刪除ItemShoppingCart items collection
  • 保存javascript中的集合索引,使Doctrine可以跟蹤引用

我忘了什麼嗎?

我發現它就在屁股大的痛苦,我比需要和其他框架/奧姆斯

有沒有辦法做到這一點更簡單?

+0

你沒有提到什麼問題。有沒有工作? –

+0

Doc會確認您的所有項目(或不):http://symfony.com/doc/current/form/form_collections.html – DOZ

+0

@dragoste問題是*並不簡單嗎?*但我會改變所以它更加明確。@DOZ我知道這個文檔的心臟(只有'orphanRemoval'提到丟失) –

回答

0

據我所知,你的問題是「爲什麼這麼複雜」,不是嗎?

好的,事實並非如此。您已經在項目中列出了多個圖層。爲了誇大這一點 - 爲什麼你沒有寫這個表單來創建這個表單,你需要安裝Symfony,甚至打開你的計算機。 ;-)

無論如何,這些東西中的大部分都不是必需的,其他的都應該在無論如何之前完成。

讓我們從OneToMany關係開始(Doctrine級別)。

ShoppingCart是你的聚合根(DDD術語,但是如果你遵循DDD的想法並不重要),這意味着你可能會在這個對象上做大部分的工作,它將處理Item的內部。如果是這樣,那麼你應該已經完成​​了關係的反轉方面,這涵蓋了這些點(我認爲你已經深入細節以使你的列表更長;-),它們都應該在一個列表項中),但它需要一個分鐘做這個東西:

  • 了我的購物關係的反向一對多側定義項
  • 確保這種關係具有級聯= {「堅持」}和orphanRemoval =真選項
  • 初始化這個項目收集到構造函數
  • 請確保andItem()& remov eItem()函數實現到我的購物
  • 設置/取消擁有方關係到我的購物除了從我的購物項目集合

這有什麼好做的形式添加/刪除項目。這是關於你希望你的實體如何與Doctrine一起工作。

以下兩個不要求:

  • 設置allow_add和allow_delete形式選項設置爲true
  • 將by_reference形式選項設置爲false

他們關於啓用/禁用功能。你想要它們,所以你需要使用它們。這是顯而易見的,仍然沒有太多要做。

最後一個:

  • 保持在JavaScript中的集合索引,以便學說可以跟蹤引用

的這是一個我其實不明白。但是,您需要的(就您的情況而言,因爲您使用allow_add/delete功能)提供的JavaScript代碼將爲新行創建HTML或刪除現有行。但這也僅僅是複製原型代碼。 Symfony的文檔中還有一些準備好的示例。

+0

1 - 我知道什麼聚合根,我從客觀的角度來看(和其他框架/ ORMs相比) –

+0

2 - 客觀地說,由於我已經可以將'Item'鏈接到'ShoppingCart',所以第一點就是說應該已經存在,不是 –

+0

3 - 你真的覺得用Doctrine設置聚合根很容易嗎? –

0

我來回答自己活在一個更簡單的方式:

  • 不,我不忘記什麼
  • 不,我們不能做簡單的

一些原因在@dragoste answer

解釋