2017-06-21 49 views
1

因爲我不能在這裏發佈真正的代碼,即時通訊使用替代品,基本上是相同的,所以請不要懷疑,如果你發現語法錯誤。學說產生完整性約束違規1451

我有以下設置: PHP 7.0,Symphony,與MySQL數據庫一起工作的Doctrine。

的類如下:

  /* 
      * @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的一堆字母的容器。

而且一個郵箱可以處於其生命中的某個時間點,而且一次只能在一個地方。但是容器可以在這兩個地方之間移動。即郵局和PostStorage。

在SQL數據庫中創建這些映射不是問題。

字母N ------ 1個郵箱(單向帶聯接表)

的MailBoxÑ------ 1個郵局或PostStorage(單向帶聯接表)

問題附帶以下功能。我希望能夠刪除/合併/拆分容器和字母的單個容器和字母。

,如果im只是想通過刪除或郵箱:

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

即時得到的,在所提到的,「誠信約束衝突」的稱號。由於郵箱可能位於不同的地方,因此我想避免在類中向所有者添加引用,因爲它會膨脹類代碼的大小,因爲我想添加更多將來郵箱的位置。

香港專業教育學院度過最後幾個小時嘗試的

Ondelete =對不同類別的CASCADE不同的組合,但我能夠做到的是可以刪除的所有類從數據庫或不使一個單一的刪除,如果我不是獲取提到的錯誤信息。

如果您需要更多信息,請告訴我。

在此先感謝。

回答

0

我發現問題的解決方案。問題不在於我錯誤地使用了Cascade選項,而是我試圖從空郵箱中刪除。換句話說,我一直在使用錯誤的索引來執行我的刪除操作。正確的設置,我現在使用:

「級聯= {」刪除「‘堅持’},orphanRemoval =真正的」

爲多對多標籤的一部分上面收集

相關問題