Symfony2 - 如何构造id = product mapping

时间:2013-01-03 14:38:18

标签: symfony doctrine

我想做这样做的映射:

用户可以拥有多个游戏游戏可以有多个所有者

我在id表格中有game列,game表格中有userownership列。我如何连接这些字段?我希望game中的userownership字段与usergame表相关。

我尝试了OneToManyManyToMany,但第一个会导致生成其他列。我想要在game表中插入任何内容。

- edit-- 我的@ManyToMany代码:

/**
 * @ORM\ManyToMany(targetEntity="Ownership")
 * @ORM\JoinTable(name="ownership",
 *      joinColumns={JoinColumn(name="user", referencedColumnName="id")},
 *      inverseJoinColumns={JoinColumn(name="game", referencedColumnName="id")}
 *      )
 */

它会在Symfony的命令行中导致错误:

  [Doctrine\Common\Annotations\AnnotationException]                            
  [Semantical Error] Couldn't find constant JoinColumn, property GameShelf\Us  
  ersBundle\Entity\User::$ownership.  

3 个答案:

答案 0 :(得分:2)

当然,如果像你说的那样,你需要多对多的关系:

  

用户可以拥有多个游戏。游戏可以拥有多个所有者。

Doctrine应创建第三个表(它可能只包含两个外键:game_id和ownership_id)。

导致错误是因为Doctrine不知道JoinColumn是什么。你只是做了错误的注释,因为你忘了(再次!;))在JoinColumn之前加上`@ORM。正确的注释应如下所示:

/**
 * @ORM\ManyToMany(targetEntity="Ownership")
 * @ORM\JoinTable(name="ownership",
 *      joinColumns={@ORM\JoinColumn(name="user", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="game", referencedColumnName="id")}
 *      )
 */

答案 1 :(得分:0)

听起来你需要引入一个新的实体(类似于OwnedGame),它保存游戏和所有者之间的连接(可能还有它自己的属性,比如购买时等)。

然后OwnedGame将是ManyToOne with Game和Owner,游戏和所有者都不需要包含新列。

答案 2 :(得分:0)

您对所需内容的描述根本不适合。 一方面,您希望仅在用户和游戏之间建立关系,并且仅在游戏和所有者之间建立关系。

但另一方面,你说用户和用户在某种程度上是相关的,但游戏和用户不是。

你应该通读 http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#many-to-many-unidirectional 并试着找到你真正需要的东西。 我建议使用连接表的ManyToMany关系。因此,您不必处理表中的其他字段