Copiar un objeto e insertar en la BD

Estoy intentado duplicar un objeto y guardarlo en la base de datos.

Creo un formulario, para que me inserten un nombre nuevo, pero el resto de información es igual. Porque es un contrato que se renueva tácitamente.

/**
     * @Route("/contrato_copiar/{id}", name="contrato_copiar")
     * @param Request $request
     * @param Contrato $contrato
     * @return Response
     */
    public function copiarAction(Request $request, Contrato $contrato)
    {
 
        $formulario = $this->createFormBuilder($contrato)
            ->add('contratoEvolutia', TextType::class)
            ->add('save', SubmitType::class, array('label' => 'Copiar Contrato'))
            ->getForm();
 
        $formulario->handleRequest($request);
 
        if ($formulario->isSubmitted() && $formulario->isValid()) {
            $contratoAcopiar = clone $contrato;
 
            $em = $this->getDoctrine()->getManager();
            $em->detach($contratoAcopiar);
            $em->persist($contratoAcopiar);
            $em->flush();
            $this->addFlash('ok', 'Se ha copiado el contrato correctamente');
 
            return $this->redirectToRoute('contrato_editar', array(
                'id' => $contratoAcopiar->getId(),
            ));
        }
 
        return $this->render("contrato_evolutia/contrato_copiar/contrato_copiar.html.twig", array(
            "contrato" => $contrato,
            "formulario" => $formulario->createView(),
        ));
    }

En el objeto Contrato e implementado.

function __clone()
    {
        $this->setId(null);
    }

Como en el form modifico la variable contratoEvolutia, al hacer el persist, me guarda los dos contratos con los nombres modificados. Si hago un clone de Contrato. ¿Porque guarda los dos objetos?

Respuestas

#1

Hola, y si intentas clonar antes de pasar el objeto al form y le pasas el clon al form:

Variante 1:

$contratoAcopiar = clone $contrato;
 
$formulario = $this->createFormBuilder($contratoAcopiar)
            ->add('contratoEvolutia', TextType::class)
            ->add('save', SubmitType::class, array('label' => 'Copiar Contrato'))
            ->getForm();

Variante 2:

$contratoAcopiar = $request->isMethod('POST') ? $contrato : clone $contrato;
 
$formulario = $this->createFormBuilder($contratoAcopiar)
            ->add('contratoEvolutia', TextType::class)
            ->add('save', SubmitType::class, array('label' => 'Copiar Contrato'))
            ->getForm();

Espero que te sirva, Saludos.