У меня есть две организации (Клиент & PhoneNumber), которые взаимодействуют друг с другом через соединение ManyToMany.
При попытке отобразить обе сущности в одной форме, я использую следующие утверждения:
$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,
)
))
Как уже говорилось в чате, лучшим решением является использование 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="" />
Других решений пока нет …