Symfony3 - 保存集合

时间:2018-01-06 18:42:32

标签: symfony collections persist

我有点问题。我有一个对象“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”也正确设置为集合。

1 个答案:

答案 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) {


    }
}