0

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

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属性foreign-key为空,这反过来又阻止了 propel 基于此模式生成模型。

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

4

1 回答 1

0

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

DDL 中的混合大小写

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

让我陷入困境的是,即使我手动更改 DDL 以匹配大小写,无论如何,如果我使用 command ,MySQL 仍然会生成小写版本的 DDL SHOW CREATE TABLE Cases;

MySQL 版本

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

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

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

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

于 2018-05-17T00:56:29.573 回答