名称为“ysdf.player_comment”的表已存在

时间:2012-07-06 10:54:05

标签: php orm doctrine doctrine-orm

我在执行orm时尝试此错误:schema-tool:create。这是我第一次使用Doctrinem,所以我有几个疑问,我认为 - 导致错误的是我有一个带有3个Comment对象数组的类Player。我对db方案的想法是:

player_comment(id_player,id_comment)
commentsliked(id_player,id_comment)
commentsdisliked(id_player,id_comment)

请注意,注释是双向关系,尽管commentsLiked和commentsDisliked不是。

据我所知,Doctrine想要将前面的3个表命名为“player_comment”。

提前致谢。

我的班级玩家看起来像这样:

/**
 * @Entity @Table(name="players") 
 */
class Player
{
/** 
 * @Id @Column(type="integer") @GeneratedValue 
 * @var int
**/
private $id;

/** 
     * @OneToMany(targetEntity="Comment", mappedBy="writer")
 * @var Comment[]
    **/
private $comments = null;
/**
 * @ManyToMany(targetEntity="Comment")
     * @Table(name="commentsliked")
 * @var Comment[]
**/
private $commentsLiked = null;
/**
 * @ManyToMany(targetEntity="Comment")
     * @Table(name="commentsdisliked")
 * @var Comment[]
**/
private $commentDisliked = null;
}

我的课评论如下:

/**
 * @Entity @Table(name="comments")
 */
class Comment {
/** 
 * @Id @Column(type="integer") @GeneratedValue 
 * @var int
**/
private $id;

/** 
     * @ManyToOne(targetEntity="Player", inversedBy="comments") 
 * @var Player
    **/
private $writer;
}

3 个答案:

答案 0 :(得分:1)

我从与关联类注释中定义的连接表和ManyToMany注释中定义的连接表的冲突中得到此问题。

具有直接ManytoMany关系的两个实体中的映射定义似乎导致使用'joinTable'注释自动创建连接表。但是,连接表已经在其底层实体类中由注释定义,我希望它使用此关联实体类自己的字段定义,以便使用其他自定义字段扩展连接表。

解释和解决方案归功于论坛“Doctrine Annotation Question”中的这篇文章。这篇文章提请注意关于ManyToMany Uni-directional relationships的Doctrine文档。查看关于使用“关联实体类”的方法的注释,从而直接在两个主要实体类之间替换多对多注释映射,在主要实体类中使用一对多注释和两个“多 - 到” - 关联实体类中的一个'注释。此论坛帖子Association models with extra fields中提供了一个示例:

public class Person {

  /** @OneToMany(targetEntity="AssignedItems", mappedBy="person") */
  private $assignedItems;

}

public class Items {

    /** @OneToMany(targetEntity="AssignedItems", mappedBy="item") */
    private $assignedPeople;
}

public class AssignedItems {

    /** @ManyToOne(targetEntity="Person")
    * @JoinColumn(name="person_id", referencedColumnName="id")
    */
private $person;

    /** @ManyToOne(targetEntity="Item")
    * @JoinColumn(name="item_id", referencedColumnName="id")
    */
private $item;

}

另请参阅Example of a Doctrine 2.x many-to-many association classDoctrine2: Best way to handle many-to-many with extra columns in reference table

答案 1 :(得分:0)

我使用了http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#many-to-many-unidirectional中指示的@JoinTable。

我更新了commentsLiked和commentsDisliked的注释:

/**
 * @ManyToMany(targetEntity="Comment")
 * @JoinTable(name="commentsliked",
 * joinColumns={@JoinColumn(name="player_id", referencedColumnName="id")},
 * inverseJoinColumns={@JoinColumn(name="commment_id",referencedColumnName="id")})
 * @var Coments[]
**/
private $commentsLiked = null;
/**
 * @ManyToMany(targetEntity="Comment")
 * @JoinTable(name="commentsDisliked",
 * joinColumns={@JoinColumn(name="player_id", referencedColumnName="id")},
 * inverseJoinColumns={@JoinColumn(name="comment_id",referencedColumnName="id")})     )
 * @var Comment[]
**/
private $commentsDisliked = null;

答案 2 :(得分:0)

一个很酷的解决方案是为ManyToMany关联提供一个“可更新视图”,并为矩阵实体使用一个真实表。这样,您将从两种方法中受益。