2014-12-05 1 views
3

У меня постоянные проблемы с встроенными формами OneToMany в Symfony2.Symfony2 Встраиваемая форма OneToMany не сохраняет объект на

На этот раз сущности сохраняются, но не ссылки на родительский класс.

Моя таблица выглядит, что

| id | position | content | about_id | 
| 29 |  1 | test 1 |  NULL | 

Я не могу понять, почему это about_id еще NULL.

Мои отношения:

Entity О:

class About { 
    /* 
    .... 
    */ 

    /** 
    * @ORM\OneToMany(targetEntity="AboutContent", mappedBy="about", cascade={"persist", "remove"}) 
    */ 
    private $content; 

    /** 
    * Add content 
    * 
    * @param AboutContent $content 
    * @return About 
    */ 
    public function addContent(AboutContent $content) 
    { 
     $this->content[] = $content; 

     return $this; 
    } 

    /** 
    * Remove content 
    * 
    * @param AboutContent $content 
    */ 
    public function removeContent(AboutContent $content) 
    { 
     $this->content->removeElement($content); 
    } 

    /** 
    * Get content 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getContent() 
    { 
     return $this->content; 
    } 
} 

My О содержании:

class AboutContent { 
    /** 
    * @ORM\ManyToOne(targetEntity="About", inversedBy="content") 
    */ 
    private $about; 

    /** 
    * Set about 
    * 
    * @param About $about 
    * @return AboutContent 
    */ 
    public function setAbout(About $about = null) 
    { 
     $this->about = $about; 

     return $this; 
    } 

    /** 
    * Get about 
    * 
    * @return About 
    */ 
    public function getAbout() 
    { 
     return $this->about; 
    } 
} 

Мой контроллер был автогенерируемая мой падла:

/** 
* Creates a new About entity. 
* 
*/ 
public function createAction(Request $request) 
{ 
    $entity = new About(); 
    $form = $this->createCreateForm($entity); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 

     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('about_show', array('id' => $entity->getId()))); 
    } 

    return $this->render('AdminBundle:About:new.html.twig', array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    )); 
} 

Мои форма bu Илдер:

$builder 
    ->add('lang', 'choice', array(
        'choices' => $this->langs, 
        'preferred_choices' => array('en'), 
     ))   ->add('media') 
    ->add('content', 'collection', array(
     'type'   => new AboutContentType(), 
     'allow_add' => true, 
     'allow_delete' => true, 
     'cascade_validation' => true 
    ), array('label'=>'Texts'))  
; 

} 

Большое спасибо, если вы найдете решение.

ответ

6

Привет всем после поиска, я наконец нашел ответ. Проблема не исходила от моих сущностей или моих отношений. Он пришел из моей формы.

В моем типе, я просто опущен, чтобы добавить тег: 'by_reference' => false

Это решило все.

Чтобы помочь вам, если у вас есть такая же проблема, ниже мой строитель:

$builder->add(
    'aboutContents', 
    'collection', 
    [ 
     'type' => new AboutContentType(), 
     'allow_add' => true, 
     'allow_delete' => true, 
     'cascade_validation' => true, 
     'by_reference' => false, 
    ], 
    [ 
     'label' => 'Texts' 
    ] 
); 
+5

я не могу поверить, что я потратил 3 часа на этом ... – AlexisWbr

+0

человек, ты спас мой день через 2 года .... – skytorner

4

Ваши новые AboutContent объекты не знают о создали About сущность, потому что форма:
- запускает addContent метод на About объекта,
- не работает setAbout на AboutContent.

Вы должны обновить поле ассоциации на стороне владельца (AboutContent), чтобы сохранить связь.

Посмотрите на определение Association Updates.

В коде:
- сторона владеющая является AboutContent лица (потому что он имеет отношение к About)
- обратная сторона About сущности

Таким образом, в addContent методе вы должны установить About для дополнительной AboutContent ,

class About { 
    //... 

    /** 
    * Add content 
    * 
    * @param AboutContent $content 
    * @return About 
    */ 
    public function addContent(AboutContent $content) 
    { 
     $this->content[] = $content; 

     $content->setAbout($this); // set the relation on the owning-side 

     return $this; 
    } 

    //... 
} 
+0

Спасибо, я попытался это, но это ничего не меняет – Jaycreation