当两个模型相互关联时,Doctrine会自动在MySQL数据库中漂亮地生成外键约束。onDelete和onUpdate的默认行为是限制,但也可以设置为set NULL或CASCADE。
现在,我想从现有数据库创建一个与YAML文件不同的迁移差异。为此,我使用了Doctrine::generateModelsFromDB()函数。我使用Doctrine_Migration_Diff的重载版本来为我做不同的工作,它处理不匹配的类名、MySQL字段长度等。它做得很好,但是这些外键约束有一个问题。
当我从MySQL数据库创建PHP类时,Doctrine似乎没有将'onDelete‘和'onUpdate’设置为适当的值。然后,当我尝试将这些PHP类与设置了'onDelete‘和/或'onUpdate’的类进行比较时,Doctrine尝试添加一个已经存在的新外键,而MySQL失败了。
我通过手动忽略重载的Doctrine_Migration_Diff中所有更改过的外键暂时解决了这个错误,但这真的不是解决方案。
我想要的:如果Doctrine认为需要添加一个新的外键,那么它很可能已经存在,以及它的onDelete和onUpdate行为设置为什么。如果我有本地字段名和外部字段名,我如何检查呢?
附言:如果有人确信Doctrine 1.2中已经修复了这个问题(我对此表示怀疑),请不要建议我升级。在这种情况下,我使用1.1有特定的原因,但那是另一回事。我宁愿被指向代码更改提供此修复的方向,这可能是更接近解决方法的一步。
发布于 2010-11-15 17:18:48
回答我自己的问题:我查看了Doctrine源代码很长一段时间,发现MySQL导入器没有这样做的功能。
换句话说,不自己扩展Doctrine是不可能的。
发布于 2010-10-27 05:25:44
嗯,我从来没有遇到过这个问题。但我通常将Doctrine与Symfony一起使用,他们可能已经定制了迁移工具,而不仅仅是将它们挂钩到Symfony CLI界面。
如果我是您,我会从DB生成一个新的schmea,然后从更新后的模式生成迁移(我认为将模式与模型进行比较)。然后再重新生成我的模型。
但是,我建议让模式具有权威性。如果您必须使用遗留数据库,则在启动时从DB生成您的模式。然后,所有的数据库在那之后进行更改,对模式进行修改,然后使用schmea/model进行迁移。
https://stackoverflow.com/questions/4028071
复制相似问题