26

symfony2.1 プロジェクトで doctrine2 を使用しています。他のテーブルとの多対 1 のリレーションシップがいくつかあるエンティティがあります。これらの多対 1 の外部キー関係はデータベースで既に更新されていますが、migrations:diff または schema:update --dump-sql を実行するたびに、同じ更新コマンドが追加され、外部キー関係が再度追加されます。schema:validate を実行すると、マッピングがデータベースと同期していないと表示されます。

私のアプリケーションは正常に動作し、リレーションシップは適切に機能しており、データベースのスキーマは正しいようです。doctrine がまだこれらの外部キーを追加しようとしているのはなぜですか?

これが私のコードです(問題のあるパラメーターの1つ):

私の「チケット」エンティティには、次のものがあります。

/**
 * Authenticated User who scored the ticket. 
 *
 * @ORM\ManyToOne(targetEntity="CS\SecurityBundle\Entity\User")
 * @ORM\JoinColumn(name="scoring_user_id", referencedColumnName="id")
 */
protected $scoringUser;

現在、一方向になるように設定しているため、User エンティティに inversedBy はありません。

これにより、既にデータベースにあるにもかかわらず、移行または schema:update ダンプに次のものが生成されます。

$this->addSql("ALTER TABLE tickets ADD CONSTRAINT FK_54469DF4BB0D9452 FOREIGN KEY (scoring_user_id) REFERENCES users (id)");

ここで何が間違っているのか分かりますか?

4

1 に答える 1

13

doctrine がまだこれらの外部キーを追加しようとしているのはなぜですか?

ここでの正しい用語は「外部キー制約」です。制約がなければ、問題の列は単なる列です。その列の値が別のテーブルの主キーとして存在することを強制するのは制約です。

doctrine がまだこれらの外部キーを追加しようとしているのはなぜですか?

データベース ベンダー/エンジンは外部キー制約をサポートしていませんが、Doctrine はそれを認識できないためです。

推測しなければならないのは、MyISAM エンジンで MySQL を使用しているということです。MyISAM は外部キー制約をサポートしていません。残念ながら、Doctrine はそれを確認できるほど「スマート」ではありません。MySQL が使用されていることがわかります。そのため、盲目的に外部キー制約がサポートされていると想定しています。

MyISAM を使用する正当な理由がない限り、InnoDB エンジンに切り替えることをお勧めします。

ALTER TABLE table_name ENGINE=InnoDB;

MyISAM から InnoDB へのテーブルの変換

于 2014-02-27T07:34:17.307 に答える