1

当我执行 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)

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

据我了解,Doctrine 想将之前的 3 个表命名为“player_comment”。

提前致谢。

我的类 Player 看起来像这样:

/**
 * @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;
}
4

3 回答 3

1

我从关联类注释中定义的连接表和 ManyToMany 注释中定义的连接表的冲突中遇到了这个问题。

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

解释和解决方案感谢论坛“教义注释问题”中的这篇文章。这篇文章提请注意有关ManyToMany 单向关系的 Doctrine 文档。查看有关使用“关联实体类”的方法的注释,从而将两个主要实体类之间的多对多注释映射直接替换为主实体类中的一对多注释和两个“多对多” -one' 关联实体类中的注释。此论坛帖子中提供了一个带有额外字段的关联模型的示例:

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;

}

另请参阅Doctrine 2.x 多对多关联类的示例Doctrine2:使用引用表中的额外列处理多对多的最佳方法

于 2013-10-02T21:22:27.170 回答
0

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

我更新了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;
于 2012-07-06T18:35:00.663 回答
0

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

于 2014-09-03T10:13:25.503 回答