Propel database:reverse 在模式中生成空的外键属性

Propel database:reverse generates empty foreign key attributes in schema

我有一个 table 是使用以下语法创建的:

CREATE TABLE `Agreements` (
  `Agreement_ID` int(30) NOT NULL AUTO_INCREMENT,
  `Case_ID` int(11) NOT NULL,
  KEY `fk_case_id` (`Case_ID`),
  CONSTRAINT `fk_case_id` FOREIGN KEY (`Case_ID`) REFERENCES `cases` (`case_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当 运行 propel database:reverse 生成的架构如下所示:

<?xml version="1.0" encoding="utf-8"?>
<database name="xxx" defaultIdMethod="native" defaultPhpNamingMethod="underscore">
  <table name="Agreements" idMethod="native" phpName="Agreements">
    <column name="Agreement_ID" phpName="AgreementId" type="INTEGER" size="30" autoIncrement="true" required="true"/>
    <column name="Case_ID" phpName="CaseId" type="INTEGER" required="true"/>
    <foreign-key foreignTable="Cases" name="fk_case_id">
      <reference local="Case_ID" foreign=""/>
    </foreign-key>
    <index name="fk_case_id">
      <index-column name="Case_ID"/>
    </index>
    <vendor type="mysql">
      <parameter name="Engine" value="InnoDB"/>
    </vendor>
  </table>
</database>

如您所见,foreign-key 元素的 foreign 属性为空,这反过来会阻止 propel 基于此架构生成模型。

我有点卡在这里 - 任何帮助将不胜感激

我找到问题所在了。对于上下文,我在 Mac OS X 上并将 lower_case_table_names 设置为 2.

DDL 中的大小写混合

正如您在我发布的 DDL 中看到的那样,case_id 是小写字母,但在 table 上定义为 Case_ID。 MySQL 不会理会这种差异,但这会导致 Propel 逆向工程和模型生成代码失败,因为它无法在 table 定义中找到外键。

让我卡在这里的是,即使我手动更改 DDL 以匹配外壳,无论如何,如果我使用命令 MySQL 仍然会生成小写版本的 DDL 14=].

MySQL 版本

似乎 MySQL 8.x - 我在开发中使用的版本 - 出现了这种奇怪的行为。在这一点上,这对我来说似乎是一个错误。

我最后做的是降级到 5.7 并重新创建我的数据库。 MySQL 5.7保留了你提供的DDL的大小写。这反过来又允许 Propel 做它的事情并成功更新模式并生成模型。

如果有人知道为什么两个 MySQL 版本的行为不同,我很想知道为什么。

我这边已经解决了这个问题。 (尽管当我们升级到 8.x 时我需要再次研究它)