Моя форма symfony представляет собой объект Mail
, который имеет отношение "один ко многим" с другим объектом, называемым Attachment
. Следовательно, форма MailType
содержит поле CollectionType
для встраивания своих AttachmentType
форм:
$builder
->add('attachments', CollectionType::class, [
'entry_type' => AttachmentType::class,
'allow_add' => true,
'allow_delete' => false,
'by_reference' => false,
]);
Мое представление будет отправлять только новые вложения в мой сервер Symfony. Поэтому при сохранении данных формы в базе данных я хочу только добавлять новые вложения к письму и не трогать существующие вложения.
К сожалению, Symfony / Doctrine ведут себя иначе: если n
вложений содержатся в данных формы, тогда n
первые существующие вложения перезаписываются этими новыми вложениями:
existing attachments (in DB): [old1, old2, old3]
new attachments (contained by HTTP request): [new1, new2]
desired result in DB: [old1, old2, old3, new1, new2]
actual result in DB: [new1, new2, old3]
Как я могу этого добиться? Я думал, что by_reference => false
вызовет вызов метода addAttachment
, поэтому я также ожидал, что это сработает "из коробки".
Мой Mail
код объекта:
class Mail {
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Attachment", mappedBy="mail", cascade={"persist", "remove"})
*/
protected $attachments;
...
public function addAttachment(\AppBundle\Entity\ttachment $attachment) {
$attachment->setMail($this);
$this->attachments[] = $attachment;
return $this;
}
}
Мой код контроллера обрабатывает форму:
// $mail = find mail in database
$form = $this->createForm(MailType::class, $mail);
$form->handleRequest($request);
if ($form->isValid()) {
$mail = $form->getData();
$em = $this->getDoctrine()->getManager();
$em->persist($mail);
$em->flush();
}
'by_reference' => false
не заставляет Symfony вызывать$this->attachments->add($attachmetn)
? Да, я создал экземпляр $ attachments как новую коллекцию ArrayCollection в конструкторе. Извините, я пропустил это выше - person fishbone   schedule 15.12.2017