2017-06-21 9 views
1

ここで実際のコードを投稿することはできません。代わりに代用を使用すると、基本的には同じです。構文上の誤りがあるかどうかは分かりません。DoctrineはIntegrityの制約違反を起こします。1451

私は以下のセットアップを持っています: PHP 7.0、Symphony、DoctrineはMySQLデータベースで動作します。

クラスは以下のとおりです。

  /* 
      * @ORM\Table(name="Postoffice") 
      * @ORM\Entity(repositoryClass="\AppBundle\Repsoitory\PostOfficeRepository") 
      */ 
      class Postoffice 
      { 
       /** 
       * Holds the Doctrine entity manager for database interaction 
       * @var EntityManager $em 
       */ 
       protected $em; 

       /** 
       * @var int 
       * @ORM\Column(name="id", type="integer") 
       * @ORM\Id 
       * @ORM\GeneratedValue(stragegy="AUTO") 
       */ 
       private $id; 

       /** @var ArrayCollection 
       * @ORM\ManyToMany(targetEntity="MailBox") 
       * @ORM\JoinTable(name="PostOfficeToMailBoxMapping", 
       *  joinColumns={@ORM\JoinColumn(name="PostOfficeId",referencedColumnName="id")}, 
       *  inverseJoinColumns={@ORM\JoinColumn(name="MailBoxId",referencedColumnName="id",unique=true)}) 
       */ 
       private $packets; 


       public function __construct(EntityManager $em) 
       { 
        $this->$packets = new ArrayCollection(); 
        $this->em = $em; 
       } 

      } 

      /* 
      * @ORM\Table(name="PostStorage") 
      * @ORM\Entity(repositoryClass="\AppBundle\Repsoitory\PoststorageRepository") 
      */ 
      class Poststorage 
      { 
       /** 
       * Holds the Doctrine entity manager for database interaction 
       * @var EntityManager $em 
       */ 
       protected $em; 

       /** 
       * @var int 
       * @ORM\Column(name="id", type="integer") 
       * @ORM\Id 
       * @ORM\GeneratedValue(stragegy="AUTO") 
       */ 
       private $id; 

       /** @var ArrayCollection 
       * @ORM\ManyToMany(targetEntity="MailBox") 
       * @ORM\JoinTable(name="PostStorageToMailBoxesMapping", 
       *  joinColumns={@ORM\JoinColumn(name="PoststorageId",referencedColumnName="id")}, 
       *  inverseJoinColumns={@ORM\JoinColumn(name="MailBoxId",referencedColumnName="id",unique=true)}) 
       */ 
       private $MailBoxes; 


       public function __construct(EntityManager $em) 
       { 
        $this->MailBoxes = new ArrayCollection(); 
        $this->em = $em; 
       } 


       public function delete() 
       { 
        //remove each box on its own 
        foreach ($this->Mailboxes as $iterMailBox) 
         $this->em->remove($iterMailBox); 
        $this->em->remove($this); 
        $this->em->flush(); 
       } 

      } 


      /* 
      * @ORM\Table(name="MailBox") 
      * @ORM\Entity(repositoryClass="\AppBundle\Repsoitory\MailBoxRepository") 
      */ 
      class MailBox 
      { 
       /** 
       * @var int 
       * @ORM\Column(name="id", type="integer") 
       * @ORM\Id 
       * @ORM\GeneratedValue(stragegy="AUTO") 
       */ 
       private $id; 

       /** @var ArrayCollection 
       * @ORM\ManyToMany(targetEntity="Letter") 
       * @ORM\JoinTable(name="MailBoxToLetterMapping", 
       *  joinColumns={@ORM\JoinColumn(name="MailBoxId",referencedColumnName="id")}, 
       *  inverseJoinColumns={@ORM\JoinColumn(name="LetterId",referencedColumnName="id",unique=true)}) 
       */ 
       private $mailsInBox; 
       __construct() 
       { 
        $mailsInBox = new ArrayCollection(); 
       } 

      } 

      class Letter 
      { 
       /** 
       * Holds the Doctrine entity manager for database interaction 
       * @var EntityManager $em 
       */ 
       protected $em; 

       /** 
       * @var int 
       * @ORM\Column(name="id", type="integer") 
       * @ORM\Id 
       * @ORM\GeneratedValue(stragegy="AUTO") 
       */ 
       private $id; 

       //lets assume this is a string 
       private $letterContent; 

      } 

今何イムは、ここでモデル化しようとするには、次のものがある:

メールボックスが手紙の束のコンテナsomethinglikeです。

1つのメールボックスは、一度に1つの場所で、1つだけで、その生涯の特定の時点に存在することができます。しかし、これらの2つの場所の間でコンテナを移動することができます。ポストオフィスとポストストレージ。

これらのマッピングをSQLデータベースに作成するのは問題ではありません。

手紙N ------ 1つのメールボックス(単方向とは、テーブルに参加)

メールボックスN ------ 1つのポストオフィスまたはPostStorage(との一方向の表を結合する)

問題が付属しています次の機能コンテナと文字の間で個々のコンテナや文字を削除/マージ/分割できるようにしたい。

イムは、単に使用して文字またはメールボックスを削除しようとした場合:

$em->remove($InstanceOfLetterOrMailBox); 
$em->flush(); 

イムは、「整合性制約違反」に述べたタイトルに、なって。

メールボックスが別の場所にある可能性があるので、私は本当にクラスの所有者にレフェリーを追加することを避けたいと思います。クラスコードのサイズを大きく膨らませます。メールボックスが将来に存在する場所。

アイブ異なるクラスに

Ondelete = CASCADEのさまざまな組み合わせを試し、最後の数時間を過ごすことが、私はやって管理するすべてのデシベルか単一削除することから、すべてのクラスを削除し、イムいない場合のいずれかでした上記のエラーメッセージが返されます。

さらに詳しい情報が必要な場合はお知らせください。

ありがとうございます。

答えて

0

私はこの問題の解決策を見つけました。問題は、私が間違ってカスケードオプションを使用していたのではなく、私は空のメールボックスから削除しようとしていたということでした。つまり、削除操作に間違ったインデックスを使用しています。コレクション

上記多くのタグに多くの一部として

「はカスケード= {」削除「 『持続』}、orphanRemovalは=真」

:私は今使用している正しい設定

関連する問題