У меня есть две сущности (Customer и 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);
}
Это вызывает следующие проблемы:
- Я больше не имею отношения к объекту телефонного номера. Теперь мне приходится выполнять различные проверки отношений клиент-сущность каждый раз, когда я его использую.
- Также мне не нравится тот факт, что я редактирую объект клиента после его успешной проверки.
- В случае, если объект имеет много отношений с другими объектами, процесс добавления и удаления, который я здесь делаю, может стать очень уродливым и запутанным.
Есть ли лучший способ сделать то, что я пытаюсь сделать здесь?
Клиент.php:
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\PhoneNumber", mappedBy="customers", cascade={"persist"})
* @Assert\Valid()
**/
protected $phoneNumbers;
Номер телефона.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,
)
))
$customer = new Customer(); $customer->addPhoneNumber(new PhoneNumber());
- person ghanbari   schedule 18.04.2015