2012-02-10 3 views
4

Je suis en train de vomir des maux de tête à ce sujet et je ne trouve pas la solution.Symfony2 et Doctrine ManyToMany realtionship

J'ai 2 entités: Movie.php et category.php

Je en veux un film d'avoir plusieurs catégories et vice-versa. C'est pourquoi j'ai choisi une relation ManyToMany.

Maintenant je me demande ... Que se passe-t-il sur le site de la base de données? Y a-t-il une table "entre-deux" qui associe movie_ids à category_ids? Mais ce n'est pas ce qui est arrivé. En fait, mon premier essai a été de créer une entité MovieCategory - j'ai mappé un film sur plusieurs catégories avec OneToMany et dans l'entité MovieCategory j'ai créé une connexion OneToOne pour obtenir le nom de catégorie de mon entité Category. Mais je suppose que ce n'est pas comme ça que ça devrait fonctionner, n'est-ce pas?

Maintenant, voici mon code de la façon dont je pense que cela devrait fonctionner, j'apprécie vraiment toute l'aide que je peux obtenir à ce sujet:

Movie.php

<?php 

/** 
* @ORM\Table(name="movies") 
* @ORM\HasLifecycleCallbacks() 
*/ 

class Movie 
{ 

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

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** @ORM\Column(type="string") */ 
protected $moviename; 

/** 
* @ORM\ManyToMany(targetEntity="Category", mappedBy="movie") 
*/ 
protected $categories; 

} 

category.php

<?php 

/** 
* @ORM\Table(name="categories") 
* @ORM\HasLifecycleCallbacks() 
*/ 

class Category 
{ 

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

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @ORM\Column(type="string") 
*/ 
protected $name; 

// ... 

/** 
* @ORM\ManyToMany(targetEntity="Movie", mappedBy="movie", cascade={"persist"}) 
*/ 
protected $movies; 


} 
+0

pourquoi faire un film ont de nombreuses catégories? un film ne peut pas être "horreur" et "drame" en même temps, c'est soit un. Je ne pense pas que vous ayez besoin d'une relation plusieurs-à-plusieurs entre le film et la catégorie. il devrait être plusieurs à un de film à catégorie, et un à plusieurs de catégorie à film – jere

+2

ManyToMany relations peuvent être une vraie douleur parce que Doctrine crée en effet une table de jointure. Beaucoup de majic en cours. Il est plus facile de créer simplement votre propre entité de jointure (MovieCategory), puis d'établir des relations OneToMany avec elle. En particulier, vous souhaitez bloquer des attributs supplémentaires sur l'entité de jointure. – Cerad

+0

@Cerad: Cependant, si vous n'avez pas besoin de données ou si vous voulez qu'elles soient suspendues sur la MovieCategory (ou dans mon cas UserRole), c'est un/lot/plus facile d'utiliser simplement le "majic". Je sais ce qu'il fait, et comment il le fait. Je ne pouvais pas me souvenir des commandes d'annotation:/ PS: Faire ce commentaire surtout pour des notes informatives. (Je suis un qui finit souvent par chercher des informations, donc j'aime quand les gens ont fait des commentaires comme ceux-ci) – Rixius

Répondre

12

Selon Doctrine docs il faut regarder la façon suivante:

// Movie.php 
/** 
* @ORM\ManyToMany(targetEntity="Category", inversedBy="movies") 
* @ORM\JoinTable(name="movies_categories") 
*/ 
protected $categories; 

// ... 

// Category.php 
/** 
* @ORM\ManyToMany(targetEntity="Movie", mappedBy="categories") 
*/ 
protected $movies; 
+0

+1 vous êtes un homme génial. J'ai essayé de comprendre cela pendant des heures ... Merci! :) – Mike

+0

Je suppose que le lien est mis à jour à ceci: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-bidirectional –

0

Vous utilisez la même valeur pour mappedBy dans les deux déclarations. De plus, la valeur que vous utilisez est singulière, elle devrait être plurielle. Cela ne peut pas fonctionner.

Questions connexes