1つのテーブルが物理アドレスAddresses
を表し、2つのテーブルがを表し、1つがを表し、もう1つがをManufacturers
表すデータベーススキーマがありますVendors
。データベースの性質上、aManufacturer
とaVendor
が同じを参照できる可能性がありますAddress
。
私の問題は、Doctrineを使用して、も参照してVendor
いるを参照しているを削除しようとしたときに始まります。 それぞれがとの関係を持っています。Address
Manufacturer
Manufacturer
Vendor
OneToOne
Address
phpMyAdminでエントリを問題なく削除でき、Doctrineでcascade="remove"
andオプションを試しましたが、どちらも機能しないようです。orphanRemoval=true
これを機能させる方法について何かアイデアはありますか?これは私がaddress
両方Manufacturer
で定義している方法ですVendor
:
/**
* @ORM\OneToOne(targetEntity="Address", orphanRemoval=true)
*/
private $address;
phpMyAdminで正常に機能しているように見えるのに、なぜこれを機能させることができないのかわかりません。関係は一方向であるため、またはとはAddress
関係ありませManufacturer
んVendor
。
編集(データベースからエンティティを実際に削除することになっているコードを表示):これが実際にエンティティを削除したコードです(ここで、はエンティティ$instance
を表す整数であり、削除するエンティティのタイプの名前です) (例):id
$entity
Address
// Grab entity from Doctrine.
$entry = $this->doctrine->em->getRepository($entity)->find($instance);
// Remove entity from database.
$this->doctrine->em->remove($entry);
// Flush the entity manager.
$this->doctrine->em->flush();
このコードの結果(インスタンスも指すインスタンスを指すインスタンスを削除しようとした場合Vendor
)は、error_logに次のようなサーバー500エラーになります。Address
Manufacturer
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`{withheld}`.`Manufacturers`, CONSTRAINT `FK_272810E7F5B7AF75` FOREIGN KEY (`address_id`) REFERENCES `Addresses` (`id`))' in {withheld}/application/libraries/Doctrine/DBAL/Connection.php:754\nStack trace:\n#0 {withheld}/application/libraries/Doctrine/DBAL/Connection.php(754): PDOStatement->execute(Array)\n#1 {withheld}/application/libraries/Doctrine/DBAL/Connection.php(438): Doctrine\\DBAL\\Connection->executeUpdate('DELETE FROM Add...', Array)\n#2 {withheld}/application/libraries/Doctrine/ORM/Persisters/BasicEntityPersister.php(464): Doctrine\\DBAL\\Connection->delete('Addresses', Array)\n#3 {withheld}/application/libraries/Doctrine/ORM/UnitOfWork.php(993): Doctrine\\ORM\\Persisters\\BasicEntityPersister->delete(Object(Proxies\\__CG__\\Entities\\Address))\n#4 {withheld}/application/libraries/Doctrine/ORM/UnitOfWork.php(331): Doctrine\\ORM\\UnitOfWork->executeDeletions(Object(Doctrine\\ORM\\Mapping\\ClassMetadata))\n#5 {withheld}/application/libraries/Doctrine/ORM/EntityManager.php(355): Doctrine\\ORM\\UnitOfWork->commit(NULL)\n#6 {withheld}/application/controllers/ajax.php(70): Doctrine\\ORM\\EntityManager->flush()\n#7 [internal function]: Ajax->delete('vendors', '1')\n#8 {withheld}/system/core/CodeIgniter.php(359): call_user_func_array(Array, Array)\n#9 {withheld}/index.php(202): require_once('{withheld}...')\n#10 {main}\n thrown in {withheld}/application/libraries/Doctrine/DBAL/Connection.php on line 754