Встраиваемая форма Symfony2 OneToMany не сохраняет сущность на

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

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

Мой стол выглядит так

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

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

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

Сущность О:

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;
}
}

Мой о содержании:

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;
}
}

Мой контроллер был автоматически сгенерирован моим crud:

/**
* 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(),
));
}

Мой конструктор форм:

$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'))
;

}

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

3

Решение

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

В моем типе я просто не добавил тег: 'by_reference' => false

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

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

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

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

Твой новый AboutContent объекты не знают о созданном About сущность, потому что форма:
— работает addContent метод на About объект,
— не работает setAbout на AboutContent,

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

Посмотрите на определение Обновления Ассоциации.

В вашем коде:
— Владеющая сторона 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;
}

//...
}
4

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