4

Doctrine 2を使用したPHPスクリプトがあります。これは、基本的に次のことを行います。

$entityManager->transactional(function($em) {
    $foreignObject = new DoctrineEntities\ForeignTable();
    $em->persist($foreignObject);
    $em->flush();
    $aObject = new DoctrineEntities\A();
    $aObject->ForeignID = $foreignObject->ID;
    $em->persist($aObject);
    $em->flush();
});

整合性制約違反が発生しています:

外部キー制約が失敗します(dbName.A、CONSTRAINT A_ForeignID FOREIGN KEY(ForeignID)REFERENCES ForeignTableID)ON DELETE NO ACTION ON UPDATE NO ACTION)

私の推測では、制約はコミットの前にチェックされ、まだコミットされていない挿入が失敗するのではなく、成功する可能性があるかどうかはチェックされません。しかし、私は本当にこれら2つの挿入ステートメントを同じトランザクションでラップしたいと思っています。それで、なにかお手伝いできますか?

アップデート

$em->persist($aObject); $em->flush();トランザクションから移動しましたが、同じエラーが発生します。どうやら、私の推測は間違っていたようです...しかし、私は本当にエラーの原因がわかりません。


SQLコンテキスト

A

CREATE TABLE `A` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `ForeignID` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `A_ForeignID` (`ForeignID`),
  CONSTRAINT `A_ForeignID` FOREIGN KEY (`ForeignID`) REFERENCES `ForeignTable` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci

テーブルForeignTable

CREATE TABLE `ForeignTable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci
4

2 に答える 2

1

MySQLのデータ整合性とFKについて読んでから、Doctrineの関連付けについて読むことをお勧めします。データの整合性は、MySQLによってInnodDBテーブルについてチェックされます。あなたがしていることは正しくありません、それは正しいはずです

$entityManager->transactional(function($em) {
    $foreignObject = new DoctrineEntities\ForeignTable();
    $em->persist($foreignObject);

    $aObject = new DoctrineEntities\A();
    $aObject->setForeign($foreignObject);
    $em->persist($aObject);

    $em->flush();
});
于 2012-11-06T17:45:06.863 に答える
0

私は問題を解決しました。それは私の質問とはまったく関係のない別の場所でした。この答えを受け入れることは本当にここにいる他の人を助けないので、代わりにgetmeの答えを受け入れるつもりです...

于 2012-11-09T21:18:10.203 に答える