Bonjour à tous,

Voilà je suis en ce moment en train de développer mon petit blog pour prendre en main Symfony2. Dans mon BlogBundle, j'ai 2 entités Article et Category.
Je souhaite faire une relation ManyToMany entre les deux entiés car un article peut avoir plusieurs categorie.
J'ai donc mes entité ecrite de la manière suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
class Article
{
.....
 
    public function __construct()
    {
        $this->setDateCreation(new \DateTime());
        $this->setDateModification(new \DateTime());
        $this->categorie = new \Doctrine\Common\Collections\ArrayCollection;
    }
 
 
    /**
     * @ORM\ManyToMany(targetEntity="Category", mappedBy="article")
     * @ORM\JoinTable(name="article_category")
     */
    private $categorie;
 
 
    // On définit le getter et le setter associé.
    public function getCategorie()
    {
        return $this->categorie;
    }
 
    // Ici, on force le type de l'argument à être une instance de notre entité Client.
    public function setCategorie(Category $categorie)
    {
        $categorie->setArticle($this);
        $this->categorie[] = $categorie;
    }
 
}
et mon entité category :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
class Category
{
    ....
  /**
     * @ORM\ManyToMany(targetEntity="Article", inversedBy="categorie"))
     * @ORM\JoinTable(name="article_category")
     */
    private $article;
 
 
    // On définit le getter et le setter associé.
    public function getArticle()
    {
        return $this->article;
    }
 
    // Ici, on force le type de l'argument à être une instance de notre entité Client.
    public function setArticle(Article $article)
    {
        $this->article[] = $article;
    }
 
    public function __construct()
    {
 
        $this->article = new \Doctrine\Common\Collections\ArrayCollection;
    }
}
</code>
 
Et dans mon controlleur voici ce que je fait :
<code type="php">
$em = $this->getDoctrine()->getEntityManager();
 
        $entity = $em->getRepository('LFABlogBundle:Article')->find($id);
 
 
        $editForm   = $this->createForm(new ArticleType(), $entity);
        $deleteForm = $this->createDeleteForm($id);
 
        $request = $this->getRequest();
 
        $editForm->bindRequest($request);
 
        if ($editForm->isValid()) {
          $formulaire = $request->request->get('lfa_blogbundle_articletype');
            $user = $this->get('security.context')->getToken()->getUser();
            $entity->setAuteur($user->getUsername());
            $entity->setSlug($this->generate_slug($entity->getTitre()));
            $entity->setContenuCache($entity->getContenu());
            $selectedCategories = $formulaire['categorie'];
             foreach ($selectedCategories as $categorie) {
               $category = $em->getRepository('LFABlogBundle:Category')->find($categorie);
$entity->setCategorie($category);
             }
 
 
            $em->persist($entity);
            $em->flush();
            return $this->redirect($this->generateUrl('article_index'));
        }
 
        return $this->render('LFABlogBundle:Backoffice:edit.html.twig', array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
Mon problème est que lors que je valide mon fomulaire, j'ai l' erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3-1' for key 'PRIMARY'
J'arrive pas a voir d'ou proviens mon erreur j'ai bien remis a jours ma base, regarder la documentation de Doctrine 2 je ne voit pas. Si par exemple je supprime de la base la table de liaison et que je la recréée via la commande. L'erreur apparait même lorsqu'elle est vide.
Si quelqu'un aurai une idée je vous remercie d'avance