Hola,
Tengo una entidad Question
y otra Answer
, estas se utilizan para un juego de preguntas donde cada pregunta puede ser de un tipo de juego distinto (tres en raya, cuatro opciones, arrastrar y soltar, etc.) y según el tipo de juego pues una o varias son correctas. Dentro de la entidad Question
tengo una relación OneToMany
hacia las respuestas y ManyToOne
hacia las preguntas desde las respuestas. A la hora de crear el formulario tengo esto:
... ->add('answersOk', CollectionType::class, array( 'entry_type' => AnswerType::class, 'allow_add' => true, 'allow_delete' => true, 'label' => 'label.answer_ok' )) ->add('answersKo', CollectionType::class, array( 'entry_type' => AnswerType::class, 'allow_add' => true, 'allow_delete' => true, 'label' => 'label.answer_ko' )) ...
Se trata de dos propiedades no mapeadas BBDD y que en sus métodos get obtengo las respuestas correctas/incorrectas de la propiedad $answers. Pero vamos, esto esta bien, se pinta bien y por JavaScript pongo o quito el numero de respuestas necesarias. El problema es cuando edito una pregunta de un tipo y la cambio a otro tipo. Es decir. Tengo una pregunta de tipo tres en raya (3 correctas y 6 incorrectas) y la cambio a otra de cuatro opciones (1 correcta y 3 incorrectas). En el controlador hago el flush y me actualiza los campos correspondientes (los que ya existian) y el resto no los borra. En las relaciones tengo puesto el cascade tanto para persist como para remove.
No estoy seguro de si se puede hacer, estoy buscando pero no encuentro nada, actualmente hago lo siguiente en el controlador y funciona:
... $em = $this->getDoctrine()->getManager($this->getUser()->getCode()); $answers = $em->getRepository('AppBundle:Answer')->findBy(['question' => $question]); foreach ($answers as $answer) { $em->remove($answer); } $em->flush(); $question->setUpdatedAt(new \DateTime()); $question->setAnswers(); $em->flush(); ...
Hago el primer flush porque no me borraba los registros antiguos. Pero claro, si no cambio nada en la pregunta y guardo, me los borra y los crea de nuevo. ¿Alguna idea sobre si se puede hacer o mejorar?.
Gracias.
Un saludo.
Respuestas
Solucionado, el problema lo estaba teniendo en el JavaScript que me eliminaba/añadía respuestas, básicamente el contador no estaba bien y me encontraba con que empezaba en muchos casos en 1 en vez de 0 y había elementos repetidos. Ademas con el orphanRemove=true
y haciendo un removeAnswer
de todas aquellas que ya no están, me funciona tal como quiero.
@LoGaNsF
Me alegro mucho, estaba viendo el caso a ver si podia ayudarte pero que bien que lo lograste.
@adelaroche