2017-12-15 26 views
3

symfony 양식은 Attachment이라는 다른 엔티티와 일대일로 많은 관계가있는 엔티티 Mail을 나타냅니다. 따라서 MailType 형태는 AttachmentType 형태를 삽입하기위한 CollectionType 필드가 포함Symfony CollectionType : 새 항목 병합

$builder 
    ->add('attachments', CollectionType::class, [ 
     'entry_type' => AttachmentType::class, 
     'allow_add' => true, 
     'allow_delete' => false, 
     'by_reference' => false, 
    ]); 

내보기는 단지 내 심포니 백엔드에 새 첨부 파일을 보낼 것입니다. 따라서 양식 데이터를 데이터베이스에 저장할 때 메일의 새로운 첨부 파일을 추가하고 기존 첨부 파일을 건드리지 않으려 고합니다.

불행하게도, 심포니/교리는 다르게 동작 :

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 => falseaddAttachment 메서드를 호출하게 만들 것이라고 생각했기 때문에 이것이 out-of-the-box에서도 작동 할 것으로 예상했다.

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(); 
    } 
+0

당신이 추가하는 ArrayCollection에 방법을 시도 적이 있습니까? 좋아요 : $ this-> attachments-> add ($ attachment); – ASOlivieri

+0

그리고 생성자에서 $ attachments를 새로운 ArrayCollection()으로 인스턴스화하고 있습니까? – ASOlivieri

+0

symfony가'$ this-> attachments-> add ($ attachmetn)'를 호출하게하는''by_reference '=> false'가 없습니까? 네, $ attachments를 생성자의 새로운 ArrayCollection으로 인스턴스화했습니다. 죄송합니다. 위의 내용을 놓친 것 같습니다. – fishbone

답변

0

. 메일 엔터티에서 다음

$builder 
     ->add('attachments', CollectionType::class, [ 
      'entry_type' => AttachmentType::class, 
      'allow_add' => true, 
      'allow_delete' => true, 
      'by_reference' => false, 
      'data' => [new Attachment()] // or add more or [] 
     ]); 

:

public function addAttachment(Attachment $attachment) { 
    $attachment->setMail($this); 
    $this->attachments[] = $attachment; 
    return $this; 
} 

public function removeAttachment(Attachment $attachment) { 
    return $this; 
} 

당신은 몇 가지 다른 기능과 당신을 위해 removeAttachment를 사용하는 경우 가장 간단한 양식 필드에 빈 데이터 또는 새 첨부 엔티티를 제공하는 것 와트 실제로 첨부 파일을 제거하려면 property_path 양식 필드의 설정을 활용할 수 있습니다 :

'property_path' => 'appendAttachments' 

addAppendAttachmentremoveAppendAttachment 만들 :

public function addAppendAttachment(Attachment $attachment) { 
    $attachment->setMail($this); 
    $this->attachments[] = $attachment; 
    return $this; 
} 

public function removeAppendAttachment(Attachment $attachment) { 
    return $this; 
}