Cascade persist

Par Yann9111, il y a 5 ans


Bonjour, j'ai un problème avec le cascade persist ou merge, je m'explique j'ai une application avec des taches ('tasks') puis une table entity (task_implements) *véhicule

Quand je crée une tache je choisi des cultures qui sont liées, si l'utilisateur choisi 3 cultures cela crée 3 taches pour les 3 culture en relation en db

Donc si l'utilisateur choisi 3 cultures puis 2 véhicules cela doit créer 3 taches avec dans chaque tache 2 véhicules bind

TaskController new()

if ( $form->isSubmitted() && $form->isValid() ) { // Cultures foreach ( $form->get('cultures')->getData() as $culture) { // Set correct status if ( $task->getUser() === null ) { $task->setStatus( 2 ); } else { $task->setStatus( 3 ); } $task->setCulture( $culture ); // Implements foreach ( $form->get('implements')->getData() as $implement) { $taskImplement = new TaskImplement(); $taskImplement->setImplement( $implement ); $task->addImplement( $taskImplement ); } $this->em->merge( $task ); $this->em->flush(); } $this->addFlash('success', 'Nouvelle tache ajoutée avec succès'); return $this->redirectToRoute('admin_task_index'); }

TaskNewType

->add('implements', EntityType::class, [ 'class' => Implement::class, 'query_builder' => function( ImplementRepository $ir ) { return $ir->createQueryBuilder('i'); }, 'choice_label' => function( Implement $implement ) { return $implement->getName(); }, 'mapped' => false, 'required' => false, 'expanded' => true, 'multiple' => true ])

TaskEntity

/** * @ORM\OneToMany(targetEntity=TaskImplement::class, mappedBy="task", orphanRemoval=true, cascade={"persist", "merge"}) */ private $implements; public function addImplement(TaskImplement $taskImplement): self { if (!$this->implements->contains($taskImplement)) { $this->implements[] = $taskImplement; $taskImplement->setTask($this); } return $this; }

Ce que je veux

Pour exemple : je doit avoir dans la table task

id / culture_id

1 10

2 11

3 12

puis dans la table task_implement

id / task_id / implement_id

1 1 20

2 1 21

3 2 20

4 2 21

5 3 20

6 3 21

Ce que j'obtiens

id / culture_id

1 10

2 11

3 12

puis dans la table task_implement

id / task_id / implement_id

1 | 1 | 20 @

2 | 1 | 21

3 | 2 | 20 @

4 | 2 | 21 @

5 | 2 | 20 @

6 | 2 | 21

7 | 3 | 20 @

8 | 3 | 21 @

9 | 3 | 20 @

10 | 3 | 21 @

11 | 3 | 20 @

12 | 3 | 21

Je ne comprend pas pourquoi ça ce ne clear pas entre chaque enregistrement en DB et ça ce duplique si je met 4 cultures j'ai 4 entrés sur le dernier TaskImplement

Merci de votre aide

Aucune réponse