我在执行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;
}
答案 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 class和Doctrine2: 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
关联提供一个“可更新视图”,并为矩阵实体使用一个真实表。这样,您将从两种方法中受益。