更新架构时,学说总是会删除并添加约束。我认为这是错误的...
php app/console doctrine:schema:update --force
Updating database schema...
Database schema updated successfully! "112" queries were executed
php app/console doctrine:schema:update --dump-sql
ALTER TABLE table.managers DROP CONSTRAINT FK_677E81B7A76ED395;
ALTER TABLE table.managers ADD CONSTRAINT FK_677E81B7A76ED395 FOREIGN KEY (user_id) REFERENCES table."user" (id) NOT DEFERRABLE INITIALLY IMMEDIATE;
...
php app/console doctrine:schema:validate
[Mapping] OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.
如何修复?
挖掘一些学说更新模式方法后,我终于找到了一个问题。问题在于表名 - " table.order"one_answers" table.user"。当教义使差异差时,由于内部逃脱(?),此名称变得非平等。因此,"用户"!=用户,以及这些表(订单,用户)总是重新创建的外键。
解决方案#1 - 仅重命名表即可避免与PostgreSQL关键字匹配的名称,例如my_user,my_order。解决方案#2 - 手动逃脱表名称。这对我不起作用,尝试了许多不同的逃脱方式。
我已经应用了解决方案#1,现在我看到了:
无需更新 - 您的数据库已经与当前同步 实体元数据
我在postgres上遇到了同样的问题,带有where子句。
*
@orm table(name =" avatar",
*
iniqueConstraints = {
*
@orm iniqueConstraint(name =" const_name",columns = {" id_user"," status"},options = {" where":":"(status ='pending'})
学说正在比较元数据和新生成的模式的模式,在索引比较中,其中条款不匹配。
string(34) "((status)::text = 'pending'::text)"
string(20) "(status = 'pending')"
您只需要更改您的条款以
匹配的条款((avatar)::text = 'pending'::text)
ps:我的问题是Postgres数据库
我希望这对某人有帮助。
我已经遇到了几次,这是因为PHP对象几次更改了几次,并且仍然与映射不匹配数据库。基本上,重新启动将解决该问题,但实施可能很难。
如果将约束放在数据库和PHP对象中(删除Doctrine2映射),则更新模式并确认无需更新。然后将学说映射添加回PHP,使用-Dump-SQL更新架构,然后查看所显示的更改。确认这正是您想要的,并执行更新查询。现在更新模式不应显示需要更新其他内容。