【问题标题】:How to figure out the Foreign Key Constraints of a MySQL table using Doctrine 1.1?如何使用 Doctrine 1.1 计算 MySQL 表的外键约束?
【发布时间】:2011-04-30 23:52:50
【问题描述】:

当两个模型相互关联时,Doctrine 会自动在 MySQL 数据库中漂亮地生成外键约束。 onDelete 和 onUpdate RESTRICT 的默认行为,但也可以设置为 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,但这是另一回事。我宁愿指出提供此修复程序的代码更改的方向,这可能更接近解决方法。

【问题讨论】:

    标签: php mysql doctrine foreign-keys constraints


    【解决方案1】:

    嗯,我从来没有遇到过这个问题。但我通常将 Doctrine 与 Symfony 一起使用,他们可能已经定制了迁移工具,而不是将它们挂接到 Symfony CLI 界面。

    如果我是你,我会从数据库生成一个新的 schmea,然后从更新的模式生成迁移(将模式与我认为的模型进行比较)。然后重新生成我的模型。

    但是,我建议使架构具有权威性。如果您必须使用旧版数据库,则在开始时从数据库中生成您的模式。然后在此之后所有 db 更改,对架构进行更改,然后使用 schmea/models 进行迁移。

    【讨论】:

    • 除非我没有正确理解答案,否则这正是我所做的,也是造成问题的原因:从数据库生成模式时,重要的 FK 信息丢失了。我的工作流程: 1. 使用 generateModelsFromDB 创建模式(= 在临时位置的 PHP 类?); 2. 从 YAML 创建模式; 3. 比较两个模式(使用我重载的 Diff 类)和 4. 将迁移应用到数据库。如果我可以手动检查数据库中是否存在 FK 约束,我可以通过重载正确的类来使用它...
    • 你误会了..我的意思是从数据库创建 YAML 模式,而不是直接从模型创建。
    • 抱歉回复晚了。如果我从数据库创建 YAML,仍然找不到原始的 onDelete 行为。
    • 我进一步研究了 Doctrine 内部结构,MySQL 导入器唯一做的就是:SELECT column_name, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.key_column_usage WHERE table_name = '。它从不请求 onUpdate 和 onDelete 行为,也从不计算外键的实际名称...
    【解决方案2】:

    回答我自己的问题:我查看了 Doctrine 源代码很长一段时间,发现 MySQL 导入器没有执行此操作的功能。

    也就是说,不自己扩展Doctrine是不可能的。

    【讨论】:

      猜你喜欢
      • 2017-01-14
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多