Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Copiar un objeto e insertar en la BD

23 de marzo de 2017

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.

@RoberRielo

1 abril 2017, 22:00