2

推進における外部キーについて質問があります。プロジェクトには、2つの物理データベースに一致する2つのスキーマがあります。ローカルデータベース(DB One)と読み取り専用情報を含むリモートDB(DB Two)です。

重要なのは、DBOneからDBTwoに外部キーを設定する必要があるということですが、それは機能しません。これが私のスキーマです:

スキーマ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」への外部キーが含まれています

私は何が間違っているのですか?

4

2 に答える 2

1

残念ながら、別のデータベースのテーブルへの外部キー参照を設定することはできないと思います。ジェネレータ ファイルを見ると、次の行が表示されます。

の、現在の github バージョンpropel/generator/lib/model/Table.phpの 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()...言い換えると、そのテーブル自体のデータベースへの参照でのみ機能するということです。あなたが求めていると思われるこの github issueにあなたの声を追加することをお勧めします。

于 2013-02-04T16:15:55.510 に答える
0

外部データベースには参加できません。ただし:データベースがサポートしている場合(PGSQL のようなデータベースが必要です)、テーブルを同じデータベース内の別のスキーマに配置できます。これにより、テーブルを同じように分離できますが、結合を適用する (および外部キーを設定する) ことができます。

于 2013-09-20T09:38:39.957 に答える