我已经有了MySQL数据库,因此我希望从existing database
创建映射元数据。
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
如何影响这一点。
答案 0 :(得分:6)
不幸的是,Doctrine 2.0不支持主键作为外键... 检查链接:http://www.doctrine-project.org/docs/orm/2.0/en/reference/limitations-and-known-issues.html
答案 1 :(得分:3)
另一种解决方案:
删除所有外键,然后它将工作:)。
我知道不推荐它,但它帮助了我。并且生成的实体工作正常。
删除所有外键:
运行此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 :(得分:0)
我得到了同样的错误,我注意到我对db中的单个关系有一些双键(约束)。删除它,每一件事都很好。
答案 3 :(得分:0)
我遇到了同样的错误。 我从现有数据库生成实体。
php bin/console doctrine:mapping:import App\\Entity annotation --path=src/Entity --force --verbose --no-interaction
错误消息是“已经声明了“ 用户”中的属性“ 空缺”,但必须将其声明”
我在调试原理时发现了错误的原因
如果一张表与多张表之间存在许多关系 和关联表上的列名相同 在vacancy_id列名称上有用户表和vacancy_a,vacancy_b之间的关系。
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);