我正在尝试使用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;
在我的用户实体中,我想建立一个自我引用的多对多关系。这就是我建立朋友列表的方式。也许我的逻辑有问题,但我直接从关于关联映射的doctrine2文档中删除了它。
答案 0 :(得分:1)
不确定是否是Exception的原因,但ORM映射中存在错误。 $ myFriends是拥有者,$ friendsWithMe是反面,因此inversedBy
属性应仅出现在$friendsWithMe
上。
尝试使用$myFriends
属性重写mappedBy
:
/**
* @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;