由于我不能在这里发布真实代码,我使用替代品,基本上是相同的,所以请不要怀疑你是否发现语法错误。
我有以下设置: 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在不同的类上,但我设法做的就是从数据库中删除所有类或者不进行单个删除,如果我没有收到提到的错误消息。
如果您需要更多信息,请与我们联系。
提前致谢。
答案 0 :(得分:0)
我找到了问题的解决方案。问题不在于我错误地使用了Cascade选项,而是我试图从空邮箱中删除。换句话说,我一直在使用错误的索引进行删除操作。我正在使用的正确设置:
“级联= {” 删除 “ ”持续“},orphanRemoval =真”
作为集合上方多对多标签的一部分