2

我目前正在开发一个带有 silex、propel 和 twig 的模块化站点。我打算在它之上创建一个安装程序项目,这样我就可以轻松地基于我的“核心”项目创建新项目。

我的数据库有一些多对多表,需要我的 schema.xml 中的isCrossRef属性。当反向工程我的MySql 数据库时,Propel 无法确定哪些表是crossRef。我明白了,但现在我想知道是否可以更改 schema.xml 生成。

让我们说如果我向需要此 isCrossRef 属性的表添加注释,那么我可以在 Propel 源代码中的哪个位置读出此注释并将所需的 IsCrossRef 添加到生成的 schema.xml 中?

4

1 回答 1

2

在阅读了一些源代码后,我自己找到了答案:

如果您想完成此操作,您需要修改文件:MysqlSchemaParser.php,位于:propel1/generator/lib/reverse/mysql(与 composer 一起安装时)

将第 99 行的记录集更改为:

while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
    $name = $row[0];
    $type = $row[1];

    if ($name == $this->getMigrationTable() || $type != "BASE TABLE") {
        continue;
    }
    /*
        Edit : Find out if table isCrossRef 
    */
    $commentStmt = $this->dbh->query("show table status like '".$name."'");
    $commentRow  = $commentStmt->fetch(PDO::FETCH_OBJ);
    $isCrossRef = (strtolower($commentRow->Comment) == 'iscrossref');
    /*
        End of edit
    */

    if ($task) {
        $task->log("  Adding table '" . $name . "'", Project::MSG_VERBOSE);
    }

    $table = new Table($name);
    $table->setIdMethod($database->getDefaultIdMethod());
    $table->setIsCrossRef($isCrossRef); /*EDIT : set is crossref to true*/
    $database->addTable($table);
    $tables[] = $table;
}
于 2013-07-05T13:05:03.830 回答