2013-08-30 6 views
3

J'ai besoin de votre aide aujourd'hui. Je travaille sur une petite application en utilisant symphonie 2.1 mais j'ai un problème de base, je dois tables avec plusieurs à plusieurs qui crée une troisième table:Symfony2 supprimer et enregistrer de nombreuses relations

class Usuario implements UserInterface { 
/** 
* @ORM\ManyToMany(targetEntity="Alood\BackBundle\Entity\Alergeno", inversedBy="usuarios") 
* @ORM\JoinTable(name="UsuariosProductos", 
*  joinColumns={@ORM\JoinColumn(name="usuario_user", referencedColumnName="user")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="alergeno_id", referencedColumnName="id")} 
*  ) 
**/ 
protected $alergenos; 
} 


public function __construct(){ 
    $this->alergenos = new ArrayCollection(); 
} 

public function getAlergenos() { return $this->alergenos; } 

et:

/** 
* @ORM\ManyToMany(targetEntity="Alood\BackBundle\Entity\Usuario", mappedBy="alergenos") 
**/ 
protected $usuarios; 

ensuite, je dois enlever la non sélectionnée alérgenos, ceci est mon contrôleur:

$alergenosUser = $em->getRepository("BackBundle:Usuario")->find($usuario); 

$resultSym = array_diff($alergenosUsuarioIds, $alergen); 

foreach($resultSym as $result) { 
    $alergenosUser->getAlergenos()->remove($result); 
} 
$em->persist($alergenosUser); 
$em->flush(); 

Pourriez-vous s'il vous plaît aidez-moi à comprendre ce que je fais mal? Merci beaucoup!

+0

Quel est exactement le problème avec votre code? ... malgré que vous persistiez objet est déjà géré par la doctrine qui n'est pas nécessaire dans ce cas? :) – nifr

+0

Disons que j'ai l'utilisateur 1 et allergène 1 et puis je dis que l'utilisateur 1 a une allergie à 1, je peux le faire, mais quand je veux supprimer cette connexion (l'utilisateur 1 n'a plus allergie à l'allergène 1) Impossible de supprimer cette relation. – soni

Répondre

4

Pour supprimer un élément d'une collection utilise les éléments suivants:

$collection->removeElement($item); 

La fonction remove($key) enlèvera par clé en removeElement($item) supprime l'élément de la collection se trouve. Jetez un oeil à la ArrayCollection code here. Sachez que la doctrine vérifie uniquement le côté propriétaire d'une relation pour les modifications.

+0

Donc, j'ai essayé de changer $ em-> persist ($ alergenosUser); pour $ em-> remove ($ alergenosUser); mais il supprime tout même l'utilisateur, je veux juste supprimer les données de la troisième table. Pourrais-tu m'aider s'il te plait? – soni

+0

alors vous voulez juste supprimer la relation entre deux entités?(ce qui entraînerait le retrait de la rangée de la table dans le jointable) – nifr

+0

Exactement! C'est ce que je veux :) – soni

0

On ne sait pas ce que les variables $alergenosUsuarioIds et $alergen représentent, mais vous pourriez être trompé sur l'utilisation de la méthode remove() de ArrayCollection. Vous devez lui donner un index, pas l'identifiant de l'entité que vous voulez supprimer. Vous pouvez également utiliser la méthode removeElement() et lui passer l'entité.

Par exemple, vous pouvez faire quelque chose comme ceci:

$elements = $alergenosUser->getAlergenos(); 
foreach ($elements as $element) { 
    if ($element->getId() == $id_from_array_diff_or_whatever) { 
     $elements->removeElement($element); 
    } 
} 

ou

$elements = $alergenosUser->getAlergenos(); 
foreach ($elements as $key => $element) { 
    if ($element->getId() == $id_from_array_diff_or_whatever) { 
     $elements->remove($key); 
     // or 
     unset($elements[$key]); 
    } 
} 

Vous pouvez également utiliser la matching() mais je ne suis pas sûr qu'il est disponible avec la version livrée avec Symfony2 2.1.

0

Donc, votre problème peut être résolu en faisant la relation vous-même. ManyToMany n'existe pas vraiment car comme vous le dites, une troisième table est créée. Vous voulez supprimer des éléments uniquement dans cette troisième table.

Vous devez donc créer vous-même la relation pour supprimer directement un élément dans la troisième table.

Donc, créez d'abord la troisième entité. Faire deux relation ManyToOne de la troisième entité aux deux autres entités. Ensuite, il vous suffit de supprimer un élément de la troisième entité que vous venez de créer.

+0

Je pense que ce n'est pas une bonne façon d'y parvenir, je l'ai fait en utilisant $ collection-> removeElement ($ item); comme @nifr, je devais simplement supprimer le paramètre orphelinRemoval = true de mon entité de doctrine. Mais merci quand même! – soni

Questions connexes