Php 条令产生完整性约束违反1451
由于我不能在这里发布真正的代码,我使用了一个替代品,这基本上是一样的,所以请不要怀疑你是否发现语法错误 我有以下设置: PHP7.0,Symphony,Doctrine,正在使用MySQL数据库 课程如下: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
/*
* @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 作为集合上方多对多标记的一部分