2015-04-17 4 views
1

У меня есть два объекта (Customer & PhoneNumber), которые находятся в действии друг с другом через соединение ManyToMany.Symfony2 - Управление отношениями сущностей к неиспользуемым объектам при сохранении

При попытке отобразить обе сущности в одной форме, я использую следующие утверждения:

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

После проверки формы мне нужно проверить, является ли раздел PhoneNumber в форме используется или нет поскольку ввод номера телефона не является обязательным требованием. Причина, по которой мне нужно сделать это: При попытке сохранить клиента, у которого есть связанный с ним объект 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="" />