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

Actualizar colección de entidades

16 de junio de 2016

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

#1

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

18 junio 2016, 13:48
#2

Me alegro mucho, estaba viendo el caso a ver si podia ayudarte pero que bien que lo lograste.

@adelaroche

20 junio 2016, 17:34