2012-02-10 77 views
4

我冻胀这个有些头痛,我没有找到解决办法。Symfony2的和教条多对多realtionship

我有2个实体:Movie.php和Category.php

我想一部电影有多个类别,反之亦然。这就是我选择ManyToMany关系的原因。

现在我想知道......在数据库站点会发生什么?是否有一个将movie_ids映射到category_ids的“中间”表?但事实并非如此。其实我的第一个尝试是制作一个MovieCategory实体 - 我用OneToMany将一个电影映射到多个类别,并在MovieCategory实体中创建OneToOne连接,以从我的类别实体中获取类别名称。但我想这不是它应该如何工作,我是对的吗?

现在,这里是我的我怎么想它应该工作的代码,我非常感谢所有帮助我能在此:

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

为什么拍电影有很多类别?一部电影不能同时成为“恐怖”和“戏剧”,而是一个。我不认为你需要电影和类别之间的多对多关系。它应该是多对一的从电影到类别,以及从类别到电影的一对多 – jere 2012-02-10 14:24:01

+2

ManyToMany关系可能是一个真正的痛苦,因为Doctrine确实创建了一个连接表。很多majic正在进行。只需创建自己的连接实体(MovieCategory)然后与它建立OneToMany关系会更容易。特别是你想要在连接实体上挂上额外的属性。 – Cerad 2012-02-10 14:40:30

+0

@Cerad:但是如果你不需要或想要任何挂在MovieCategory上的数据(或者在我的情况下是UserRole),使用“majic”很容易/很容易。我知道它在做什么,它是如何做到的。我不记得注释命令:/ PS:使这个注释主要用于提供信息的注释。 (我是一个最终会经常寻找信息的人,所以我喜欢当人们提出这样的评论时) – Rixius 2013-02-22 16:02:14

回答

12

根据Doctrine docs它看起来应该是这样的:

// 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你是一个真正的男人。试图弄清楚了几个小时......谢谢! :) – Mike 2012-02-10 14:37:04

+0

我猜链接更新为这样的:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-bidirectional – 2016-02-08 04:32:27

0

在两个声明中,您都使用mappedBy的相同值。另外,你使用的价值是单数,它应该是复数。这是行不通的。