我有点问题。我有一个对象“persona”,有几个集合。 我有一个表单,它呈现所有集合,并允许我添加和删除集合。 之后,我转储所有信息,对象“persona”包含我在提交表单时发送的所有集合。 当我坚持并刷新数据时,doctrine会保存角色而不是集合
这是我的配置:
实体角色
/**
* @ORM\OneToMany(targetEntity="PersonaDomicilio",mappedBy="idPersona",cascade={"persist"},orphanRemoval=true)
*/
private $domicilios;
public function __construct() {
$this->domicilios = new ArrayCollection();
}
public function getDomicilios() {
return $this->domicilios;
}
public function addDomicilio(PersonaDomicilio $persona_domicilio) {
$persona_domicilio->setIdPersona($this);
$this->domicilios[] = $persona_domicilio;
}
public function removeDomicilio(PersonaDomicilio $persona_domicilio) {
$this->domicilios->removeElement($persona_domicilio);
}
实体PersonaDomicilio
/**
* @var \AppBundle\Entity\Persona
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Persona",inversedBy="domicilios")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_persona", referencedColumnName="id_persona")
* })
*/
private $idPersona;
PersonaType
->add('domicilios', CollectionType::class, array(
'entry_type' => PersonaDomicilioType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'label' => false
))
控制器操作
$em = $this->getDoctrine()->getManager();
$persona = new Persona();
$formulario = $this->createForm(
PersonaType::class,
$persona,
array('action' => $this->generateUrl('persona_create'),
'method' => 'POST')
);
$formulario->handleRequest($request);
$persona->setFisicaJuridica('F');
$em->persist($persona);
$em->flush();
我不想用foreach手动持有所有集合,因为级联持续存在会有助于实现这一点。 我不得不说我做了几次测试,我不明白为什么不起作用。
Pd:“id_persona”也正确设置为集合。
答案 0 :(得分:0)
这是“正常的”。如果你引用这个old symfony documentation(它仍然有效),你还必须保留你的PersonaDomicilio(参见Doctrine:确保数据库持久性这一段。)
以下是他们的例子:
// src/Acme/TaskBundle/Controller/TaskController.php
use Doctrine\Common\Collections\ArrayCollection;
// ...
public function editAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$task = $em->getRepository('AcmeTaskBundle:Task')->find($id);
if (!$task) {
throw $this->createNotFoundException('No task found for id '.$id);
}
$originalTags = new ArrayCollection();
// Create an ArrayCollection of the current Tag objects in the database
foreach ($task->getTags() as $tag) {
$originalTags->add($tag);
}
$editForm = $this->createForm(new TaskType(), $task);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
// remove the relationship between the tag and the Task
foreach ($originalTags as $tag) {
if (false === $task->getTags()->contains($tag)) {
// remove the Task from the Tag
$tag->getTasks()->removeElement($task);
// if it was a many-to-one relationship, remove the relationship like this
// $tag->setTask(null);
$em->persist($tag);
// if you wanted to delete the Tag entirely, you can also do that
// $em->remove($tag);
}
}
$em->persist($task);
$em->flush();
// redirect back to some edit page
return $this->redirectToRoute('task_edit', array('id' => $id));
}
// render some form template
}
这里有一个配置示例(未经测试)
<?php
// Create an ArrayCollection of the current domicilios objects in the database
$originalDomicilios = new ArrayCollection();
foreach ($persona->getDomicilios() as $domicilio) {
$originalDomicilios->add($domicilio);
}
// Check request
$form->handleRequest($request);
// Was the form submitted?
if ($form->isSubmitted() && $form->isValid()) {
try {
// Handle domicilios
foreach ($originalDomicilios as $domicilio) {
if (false === $persona->getDomicilios()->contains($domicilio)) {
// remove the persona from the domicilio (or remove it)
$domicilio->removePersona($persona);
// Persist domicilio
$em->persist($domicilio);
}
}
// Save new domicilios
foreach($persona->getDomicilios() as $domicilio){
if (false === $originalDomicilios->contains($domicilio)){
// Add persona
$domicilio->addPersona($persona);
// Persist domicilio
$em->persist($domicilio);
}
}
// Persist persona
$em->persist($persona);
// Save
$em->flush();
...
} catch (\Exception $e) {
}
}