2015-04-17 83 views
1

我有兩個實體(客戶&電話號碼),這些實體通過ManyToMany連接相互實現。Symfony2 - 管理實體關係到未使用的實體持久時

當試圖以某種形式顯示兩個實體,我用以下語句:

$customer = new Customer(); 
$customer->addPhoneNumber(new PhoneNumber()); 
$form = $this->createForm(new CustomerType(), $customer, array(
    'action' => $this->generateUrl('customer_add'), 
)); 

我需要檢查的形式******中國部分是否已被使用或不是形式的驗證之後因爲輸入電話號碼不是必需的。我需要這樣做的原因是:當試圖持有一個PhoneNumber-Entity連接到沒有設置值(= NULL值)的客戶時,我從數據庫中獲得一個NOT NULL-Error。

所以我做的是:在驗證表格後,我刪除PhoneNumber-Entity-Relation到客戶,以防未輸入電話號碼。

$phoneNumber = $customer->getPhoneNumbers()->first(); 
if(empty($phoneNumber->getPrefix()) && empty($phoneNumber->getNumber())) { 
    $customer->removePhoneNumber($phoneNumber); 
} 

這導致以下問題:

  • 我不再有關係的電話號碼實體。現在,我每次使用它時都必須對客戶實體的關係進行各種檢查。
  • 另外我不喜歡我在驗證成功後編輯客戶實體的事實。
  • 如果一個實體與其他實體有很多關係,我在這裏執行的這個添加和刪除過程可能會變得非常醜陋和令人困惑。

有沒有更好的方法來做我想在這裏做的事情?


Customer.php:

/** 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\PhoneNumber", mappedBy="customers", cascade={"persist"}) 
* @Assert\Valid() 
**/ 
protected $phoneNumbers; 

PhoneNumber.php:

/** 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Customer", inversedBy="phoneNumbers", cascade={"persist"}) 
* @ORM\JoinTable(name="cp_relation") 
**/ 
protected $customers; 

CustomerType.php:

# ... 
->add('phoneNumbers', 'collection', array(
      'type' => new PhoneNumberType(), 
      'options' => array(
       'required' => false, 
     ) 
    )) 
+0

轉儲你的形式與實體映射在這裏,或閱讀本文件:http://symfony.com/doc/current/reference/forms/types/collection.html – ghanbari

+0

完成 - 也許它與delete_empty和allow_delete有關,但我不確定這是否會完全解決我所說的問題。 – chrisp

+0

好的,只是讓我的想法設置正確:啓用delete_empty將刪除所有空表單,以防在這些字段中未插入任何數據。爲了能夠稍後編輯客戶,也許刪除電話號碼,我將不得不打開allow_delete。在編輯客戶時,通過確保一致的數據庫關係,一切都應該正常工作? – chrisp

回答

3

如在聊天室所討論的,最佳的解決方案是使用collection type並設置allow_add=true並使用jQuery & prototype字段,讓用戶添加字段。

但在你的情況(因爲你不想使用jquery和依靠js),可以使靜態字段(不要忘記設置allow_add=true):

<input type="email" id="form_emails_0" name="form[emails][0]" value="" /><br> 
<input type="email" id="form_emails_1" name="form[emails][1]" value="" />