Symfony2 Doctrine2从现有数据库映射(异常)

5

我已经有一个MySQL数据库,因此我希望从现有的数据库创建映射元数据。

php app/console doctrine:mapping:convert xml ./src/MainBundle/Resources/config/doctrine/metadata/orm --from-database --force

然而,我遇到了以下异常。
[Doctrine\ORM\Mapping\MappingException] 
Property "customerid" in "Accountcustomer" was already declared, but it must be declared only once

在数据库中,我没有在任何主键/复合键中使用customerId,但我已经多次将其用作外键。

然而,我不知道将customerId放入复合键或其他主键中会如何影响这个问题。


1
这个错误提示表明同一张表上存在重复的(或更多)外键。只保留一个外键可以解决问题。 - pdolinaj
4个回答

6

好的,但是在空数据库上使用doctrine:schema:create时我遇到了完全相同的错误... - FMaz008
这在Doctrine 2.1上仍然无法工作(反向工程部分)。 - Matt

4
另一个解决方案:
删除所有外键,然后它就可以工作了 :)。
我知道这并不被推荐,但它对我有帮助,并且生成的实体运行良好。
要删除所有外键:
运行以下SQL查询语句: MySQL
SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';') 
FROM information_schema.key_column_usage 
WHERE CONSTRAINT_SCHEMA = 'db_name' AND referenced_table_name IS NOT NULL;

PostgreSQL

SELECT concat('ALTER TABLE ', table_name, ' DROP CONSTRAINT IF EXISTS ', constraint_name, ';')
FROM information_schema.key_column_usage
WHERE constraint_schema = 'public' AND constraint_catalog = 'one' AND constraint_name LIKE '%_fkey';

然后再运行生成的SQL查询。


2
删除所有外键并不是一个好的解决方案。错误明显表明在同一张表上存在重复(或更多)的外键。只保留一个外键可以解决这个问题。 - pdolinaj
我想提醒一下,数据库备份程序可能是必要的预防措施。+1 有帮助。 - BlitZ

2

我遇到了同样的错误。 我是从现有的数据库生成实体的。

php bin/console doctrine:mapping:import App\\Entity annotation --path=src/Entity --force --verbose --no-interaction

错误信息是“在‘User’中已经声明了属性‘vacancy’,但必须声明它”
在调试Doctrine时,我找到了错误的原因。
如果一张表与许多其他表之间存在多对多关系,并且相关表上的列名相同, 那么就会发生这种情况。在上述例子中,User表和vacancy_a、vacancy_b表通过vacancy_id列名建立了关联。
select C.COLUMN_NAME,C.TABLE_NAME,K.* from information_schema.KEY_COLUMN_USAGE K inner join information_schema.`COLUMNS` C on (C.TABLE_NAME = K.TABLE_NAME and C.TABLE_SCHEMA = K.TABLE_SCHEMA) where K.TABLE_SCHEMA='schema_name' and K.REFERENCED_TABLE_NAME='**user**' and C.COLUMN_NAME='**vacancy**_id' order by C.COLUMN_NAME

查询结果涉及列和表格。

解决方案:将其重命名为列名称。

ALTER TABLE vacancy_a CHANGE vacany_id vacancy_a_id int(11);

0

我遇到了同样的错误,发现数据库中有一些单关系的双重键(约束)。删除它后,一切正常运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接