Doctrine生成完整性约束违规1451

时间:2017-06-21 18:56:51

标签: php mysql doctrine-orm doctrine

由于我不能在这里发布真实代码,我使用替代品,基本上是相同的,所以请不要怀疑你是否发现语法错误。

我有以下设置: 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;

            }

现在我想在这里建模的是:

邮箱就像是一堆信件的容器。

单个邮箱可以在其生命中的某个点上一次只能在一个地方,而且只能在一个地方。但是容器可以在这两个地方之间移动。即Postoffice和PostStorage。

在SQL数据库中创建这些映射不是问题。

字母N ------ 1个邮箱(带有连接表的单向)

MailBox N ------ 1 PostOffice或PostStorage(单向连接表)

问题来自以下功能。我希望能够从容器和字母中删除/合并/拆分单个容器和字母。

如果我只是尝试使用以下方法删除信件或邮箱:

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

我在提到的标题中获得了#34;完整性约束违规"。

由于邮箱可以在不同的地方,我真的想避免在类中向主人添加引用,因为它会大大增加类代码的大小,因为我想添加更多的地方邮箱将来驻留。

我花了最后几个小时尝试不同的

组合

Ondelete = CASCADE在不同的类上,但我设法做的就是从数据库中删除所有类或者不进行单个删除,如果我没有收到提到的错误消息。

如果您需要更多信息,请与我们联系。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我找到了问题的解决方案。问题不在于我错误地使用了Cascade选项,而是我试图从空邮箱中删除。换句话说,我一直在使用错误的索引进行删除操作。我正在使用的正确设置:

“级联= {” 删除 “ ”持续“},orphanRemoval =真”

作为集合上方多对多标签的一部分