У меня есть два объекта (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,
)
))
сваливать свою форму & сущность сопоставление здесь или чтение этого документа: http://symfony.com/doc/current/reference/forms/types/collection.html – ghanbari
Выполнено - Возможно, оно имеет какое-то отношение к delete_empty и allow_delete, но я не уверен, что это будет полностью исправить проблемы, о которых я говорил. – chrisp
Итак, я решил настроить правильно: Включение delete_empty удалит все пустые формы, если в эти поля не будут вставлены данные. Чтобы иметь возможность редактировать клиентов позже и, возможно, удалить номер телефона, мне придется включить allow_delete. С этим набором и за счет обеспечения согласованной базы данных при редактировании клиентов все должно работать правильно? – chrisp