Propel数据库:反向生成模式中的空外键属性

时间:2018-05-16 03:03:39

标签: php propel propel2

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

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属性为空,这反过来又阻止了推进器根据此模式生成模型。

我有点被困在这里 - 任何帮助都会受到赞赏

1 个答案:

答案 0 :(得分:0)

我发现了问题所在。对于我在Mac OS X上的上下文,并将MouseAdapter mouseHandler = new MouseAdapter() { private Point offset; private Racquet racquet; @Override public void mousePressed(MouseEvent e) { // Did we click on a racquet? if (racquet.getBounds().contains(e.getPoint())) { // The difference between the mouse point and the original of the racquet offset = new Point(e.getPoint().x - racquet.getBounds().x, e.getPoint().y - racquet.getBounds().y); } } @Override public void mouseDragged(MouseEvent e) { // Are we dragging a racquet if (offset != null) { int newX = e.getPoint().x - offset.x; int newY = e.getPoint().y - offset.y; // This should be applied as a setting, but here we are racquet.x = newX; } } @Override public void mouseReleased(MouseEvent e) { // Release racquet offset = null; } }; // The mouseHandler needs to be added to the primary rendering surface // component. addMouseListener(mouseHandler); addMouseMotionListener(mouseHander); 设置为lower_case_table_names

DDL中的混合案例

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

让我感到困惑的是,即使我手动更改DDL以匹配大小写,无论如何,如果我使用命令Case_ID,MySQL仍然会生成小写版本的DDL。

MySQL版本

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

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

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

这个问题现在已经解决了。 (虽然如果我们升级到8.x,我需要再次查看它)