php - Doctrine2 重复键名错误

标签 php mysql symfony orm doctrine-orm

我正在尝试通过 symfony2 的控制台使用doctrine2 迁移和模式更新。我的所有实体都是通过以下方式毫无问题地生成的:

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;

在我的用户实体中,我想建立一个自引用的多对多关系。这就是我建立 friend 列表的方式。也许我的逻辑有问题,但我直接从有关关联映射的doctrine2文档中摘取了这一点。

最佳答案

不确定这是否是异常的原因,但您的 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;

关于php - Doctrine2 重复键名错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17825815/

相关文章:

mysql - 三个表,根据第一个表(mysql)得到第2个和第3个表的所有结果

symfony - Symfony2 中 Swiftmailer 的多个实例

Symfony:为什么方法 $this->get() 在构造函数中不可用?

php - 如何进行不区分大小写的搜索

php - Laravel 5.1 Model::find 上的 Eloquent 变更表

php - Yii2 ActiveRecord 与关系结果转换为 JSON

jquery - 从 Symfony2 Controller 中的序列化字符串获取数据

php - PHP如何只获取MYSQL数据库中指定时间段内的记录?

php - 使用 CASE WHEN THEN 语句更新 MySQL 表中的多行 - 不起作用

Php echo 超链接错误与 br