私のsymfonyフォームは、Mail
エンティティを表します。このエンティティは、Attachment
という別のエンティティと1対多のリレーションシップを持っています。したがって、MailType
フォームは、そのAttachmentType
フォームを埋め込むためCollectionType
フィールドが含まれていますSymfony CollectionType:新しいエントリをマージする
$builder
->add('attachments', CollectionType::class, [
'entry_type' => AttachmentType::class,
'allow_add' => true,
'allow_delete' => false,
'by_reference' => false,
]);
私の見解は私のsymfonyのバックエンドに新しい添付ファイルを送信します。したがって、フォームデータをデータベースに保存する際には、メールの新しい添付ファイルを追加するだけで、既存の添付ファイルには触れないようにします。
残念ながら、symfonyの/ Doctrineは異なる挙動を示す:
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]
どのように私はこれを達成することができます:n
添付ファイルはフォームデータに含まれている場合は、n
まず既存の添付ファイルは、これらの新しい添付ファイルによって上書きされますか?私は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();
}
あなたは追加のArrayCollectionの道を試みたことがありますか?次のようになります:$ this-> attachments-> add($ attachment); – ASOlivieri
コンストラクタで$ attachmentsを新しいArrayCollection()としてインスタンス化していますか? – ASOlivieri
symfonyが '$ this-> attachments-> add($ attachmetn)'を呼び出すのは ''by_reference' => false'をしません?はい、コンストラクタで$ attachmentsを新しいArrayCollectionとしてインスタンス化しました。申し訳ありませんが、上記を逃した – fishbone