Php 条令产生完整性约束违反1451

Php 条令产生完整性约束违反1451,php,mysql,doctrine-orm,doctrine,Php,Mysql,Doctrine Orm,Doctrine,由于我不能在这里发布真正的代码,我使用了一个替代品,这基本上是一样的,所以请不要怀疑你是否发现语法错误 我有以下设置: PHP7.0,Symphony,Doctrine,正在使用MySQL数据库 课程如下: /* * @ORM\Table(name="Postoffice") * @ORM\Entity(repositoryClass="\AppBundle\Repsoitory\PostOfficeRepositor

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

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

            }
现在,我试图在这里建立以下模型:

            /*
             * @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;

            }
邮箱有点像一个装着一堆信件的容器

一个邮箱在其生命中的某个时刻,一次只能在一个地方,而且只能在一个地方。但是容器可以在这两个地方之间移动。i、 e.邮局和邮政仓库

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

字母N------1邮箱(单向连接表)

邮箱N------1邮局或邮局存储(单向连接表)

问题来自以下特性。我希望能够删除/合并/拆分单个容器和信件,以及从容器和信件中删除/合并/拆分单个容器和信件

如果我只是试图通过以下方式删除信件或邮箱:

$em->remove($InstanceOfLetterOrMailBox);
$em->flush();
我得到的标题中提到的“完整性约束冲突”

由于邮箱可能位于不同的位置,我确实希望避免在类中添加对所有者的引用,因为这样会大大增加类代码的大小,因为我希望在将来为邮箱添加更多的位置

我在过去的几个小时里尝试了不同的组合

Ondelete=在不同的类上级联,但我所能做的就是从数据库中删除所有类,或者如果我没有收到所提到的错误消息,就不进行一次删除

如果你需要更多的信息,请告诉我


提前谢谢。

我找到了这个问题的解决办法。问题不是我没有正确使用级联选项,而是我试图从一个空邮箱中删除。换句话说,我的删除操作使用了错误的索引。我现在使用的正确设置:

cascade={“remove”,“persist”},orphanremove=true


作为集合上方多对多标签的一部分,我找到了解决问题的方法。问题不是我没有正确使用级联选项,而是我试图从一个空邮箱中删除。换句话说,我的删除操作使用了错误的索引。我现在使用的正确设置:

cascade={“remove”,“persist”},orphanremove=true

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