2017-06-21 77 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 =真正的”

为多对多标签的一部分上面收集

相关问题