更新架构时,doctrine总是会丢弃并添加约束。我想,这是错误的......
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.
如何解决这个问题?
答案 0 :(得分:2)
在深入研究一下doctrine更新模式方法之后,我终于找到了一个问题。问题在于表名 - “table.order”和“table.user”。当学说制造差异时,由于内部逃逸(?),这个名称变得不相等。因此,“user”!= user,以及这些表(订单,用户)的外键总是重新创建。
解决方案#1 - 只需重命名表格以避免与postgresql关键字匹配,例如my_user,my_order。 解决方案#2 - 手动转义表名称。这不适合我,尝试了许多不同的逃避方式。
我已经应用了解决方案#1,现在我看到了:
无需更新 - 您的数据库已与当前数据库同步 实体元数据
答案 1 :(得分:1)
我在Postgres上遇到了一个带有where子句的uniqueConstraint的问题。
*
@ORM \ Table(name =" avatar",
*
uniqueConstraints = {
*
@ORM \ UniqueConstraint(name =" const_name",columns = {" id_user"," status"},options = {"其中":"(状态='待定')"})
Doctrine正在比较元数据和新生成的模式中的模式,在索引比较期间,子句不匹配。
string(34) "((status)::text = 'pending'::text)"
string(20) "(status = 'pending')"
你只需要通过
改变你要匹配的子句((avatar)::text = 'pending'::text)
PS:我的问题出在Postgres数据库
我希望这会对某人有所帮助。
答案 2 :(得分:0)
我遇到过这几次,这是因为php对象被更改了几次,但仍然与数据库的映射不匹配。基本上重启会解决问题,但实施起来可能很难。
如果删除数据库和php对象中的约束(删除doctrine2映射),则更新模式并确认不需要更新任何内容。然后将doctrine映射添加回php,使用--dump-sql更新模式并查看显示的更改。确认这正是您想要的并执行更新查询。现在更新架构不应该显示其他任何东西需要更新。