使用Propel的远程数据库的外键

时间:2013-02-04 09:10:33

标签: php propel

我对推进中的外键有疑问。 我的项目中有2个模式与2个物理数据库匹配: 我的本地人(DB One)和a 带有一些只读信息的远程DB(DB Two)

关键是我需要将一个外键从DB One设置为DB Two,但它不起作用。 这是我的架构:

架构1

<database package="dbOne" defaultIdMethod="native" name="dbOne">
  <table name="tableOne">
    <column name="pk_tableOne" type="INTEGER" primaryKey="true" required="true" autoIncrement="true"/>
    <column name="column_one" type="DOUBLE" required="true"/>
    <foreign-key name="fk_column_one" foreignTable="tableTwo" foreignSchema = "dbTwo">
      <reference local="column_one" foreign="column_two"/>
    </foreign-key>
      </table>
</database>

架构2

<database package="dbTwo" defaultIdMethod="native" name="dbTwo">
  <table name="tableTwo">
    <column name="column_two" type="DOUBLE" primaryKey="true" required="true"/>
</database>

我已经使用两个数据源设置了runtime / build-conf.xml,在om / diff命令期间我收到了这个错误:

  

目标“om-template”的执行失败,原因如下:   “tableOne”包含不存在的表“dbTwo.tableTwo”

的外键

我做错了什么?

2 个答案:

答案 0 :(得分:1)

不幸的是,我认为您不能在不同的数据库上设置对表的外键引用。如果查看生成器文件,我们会看到以下行:

propel/generator/lib/model/Table.phpcurrent github version中的第901行:

public function setupReferrers($throwErrors = false)
{
  foreach ($this->getForeignKeys() as $foreignKey) {

    // table referrers
    $foreignTable = $this->getDatabase()->getTable($foreignKey->getForeignTableName());
    if ($foreignTable !== null) {
      ...
    } elseif ($throwErrors) {
      throw new BuildException(sprintf(
        'Table "%s" contains a foreign key to nonexistent table "%s"',
        $this->getName(),
        $foreignKey->getForeignTableName()
      ));
    }
    ...
  }
  ...
}

关键是它所说的$foreignTable = $this->getDatabase()...,换句话说,它只能用于对该表自己的数据库的引用。我建议将你的声音添加到this github issue,这似乎是你要求的。

答案 1 :(得分:0)

您无法加入外国数据库。但是:如果您的数据库支持它(您需要像PGSQL这样的数据库),您可以将表放在同一数据库中的单独模式中。这为您提供了相同的表格分隔,但能够应用连接(以及设置外键)。