Doctrine2重复键名错误

Posted

技术标签:

【中文标题】Doctrine2重复键名错误【英文标题】:Doctrine2 Duplicate key name error 【发布时间】:2013-07-24 05:25:09 【问题描述】:

我正在尝试通过 symfony2 的控制台使用教义 2 迁移和架构更新。我所有的实体都是通过以下方式生成的,没有问题:

php app/console doctrine:generate:entities myProject

此外,使用以下命令,我可以毫无问题地创建我的数据库并从头开始构建我的架构:

php app/console doctrine:database:create
php app/console doctrine:schema:create

每当我修改、删除或添加另一个实体时,我总是使用以下方法重新生成我的实体:

php app/console doctrine:generate:entities myProject

然而,问题是每当我想更新我的架构时,我总是会收到以下错误:

  [Doctrine\DBAL\DBALException]                                                
  An exception occurred while executing 'CREATE INDEX IDX_F7129A80A76ED395 ON  
   user_user (user_id)':                                                       

  SQLSTATE[42000]: Syntax error or access violation: 1061 Duplicate key name   
  'IDX_F7129A80A76ED395'                                                       






  [PDOException]                                                               
  SQLSTATE[42000]: Syntax error or access violation: 1061 Duplicate key name   
  'IDX_F7129A80A76ED395' 

我已经尝试过:

php app/console doctrine:schema:update --force

php app/console doctrine:migrations:diff
php app/console doctrine:migrations:migrate

但我总是遇到同样的错误。我究竟做错了什么?有什么方法可以让我更新我的数据库,而不必每次都销毁和构建一个全新的数据库?我有超过 25 个实体,它们由带有许多关联映射(OneToOne、OneToMany、ManyToMany 等)的大文件组成,这似乎会导致问题。任何帮助都会很棒!谢谢!

顺便说一句,我感觉这段代码可能会导致问题:

/**
 * @ORM\ ManyToMany(targetEntity="User", inversedBy="myFriends")
 */
protected $friendsWithMe;

/**
 * @ORM\ ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
 * @ORM\ JoinTable(name="friends",
 *      joinColumns=@ORM\ JoinColumn(name="user_id", referencedColumnName="id"),
 *      inverseJoinColumns=@ORM\ JoinColumn(name="friend_user_id", referencedColumnName="id")
 *      )
 **/
protected $myFriends;

在我的用户实体中,我想建立一个自引用的多对多关系。这就是我建立朋友列表的方式。也许我的逻辑有问题,但我直接从关于关联映射的教义2文档中删除了这一点。

【问题讨论】:

检查用户表中的 user_id 是否重复。如果没有,您可以尝试手动删除所有索引并运行php app/console doctrine:schema:update --force user_id 确实存在,但是如果它是构建它的模式,学说不应该知道如何更新模式吗?我希望原则不会强迫我手动弄乱数据库,因为这是一个可怕的想法。在我看来,学说只是忽略了我的 @JoinTable(name="friend" ... 注释。它正在尝试使用默认设置构建一个名为 user_user 的表,尽管我已经明确告诉它使用我的设置。 注解中的mb空格碰这个? @ORM\ JoinTable 【参考方案1】:

不确定这是异常的原因,但您的 ORM 映射中有错误。 $myFriends 是拥有方,$friendsWithMe 是反方,所以inversedBy 属性应该只存在于$friendsWithMe

尝试用mappedBy属性重写$myFriends

/**
 * @ORM\ ManyToMany(targetEntity="User", mappedBy="friendsWithMe")
 * @ORM\ JoinTable(name="friends",
 *      joinColumns=@ORM\ JoinColumn(name="user_id", referencedColumnName="id"),
 *      inverseJoinColumns=@ORM\ JoinColumn(name="friend_user_id", referencedColumnName="id")
 *      )
 **/
protected $myFriends;

【讨论】:

以上是关于Doctrine2重复键名错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Doctrine2/Symfony2 中的重复条目上插入忽略

Doctrine2 - HasLifecycleCallbacks - 语义错误

Doctrine2 findBy 关系对象触发字符串转换错误

Doctrine2 Merge() 因复合索引而失败教义2错误?

如何避免与 Doctrine2 和 Zend Framework 2 的多对多关系重复?

Doctrine2 “Like” SQL 查询和“Class true 不存在”错误