Symfony2 — Управление отношениями сущностей с неиспользуемыми сущностями при сохранении

У меня есть две организации (Клиент & 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,
)
))

1

Решение

Как уже говорилось в чате, лучшим решением является использование 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="" />
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]