我有这些实体(问题的相关部分):
/**
* Criterion
*
* @ORM\Table(name="innova_stepcondition_criterion")
* @ORM\Entity(repositoryClass="Innova\PathBundle\Repository\CriterionRepository")
*/
class Criterion implements \JsonSerializable
{
/**
* Criteriagroup
* @var \Innova\PathBundle\Entity\Criteriagroup
*
* @ORM\ManyToOne(targetEntity="Innova\PathBundle\Entity\Criteriagroup", inversedBy="criteria", cascade={"all"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(onDelete="SET NULL")
* })
*/
protected $criteriagroup;
}
和
/**
* Criteriagroup
*
* @ORM\Table(name="innova_stepcondition_criteriagroup")
* @ORM\Entity(repositoryClass="Innova\PathBundle\Repository\CriteriagroupRepository")
*/
class Criteriagroup implements \JsonSerializable
{
/**
* Criteria linked to the criteriagroup
* @var \Doctrine\Common\Collections\ArrayCollection
*
* @ORM\OneToMany(targetEntity="Innova\PathBundle\Entity\Criterion", mappedBy="criteriagroup", indexBy="id", cascade={"persist", "remove"})
*/
protected $criteria;
}
当我尝试删除条件组时,我想删除附加的条件。我有这个错误:
An exception occurred while executing 'DELETE FROM innova_stepcondition_criteriagroup WHERE id = ?' with params [1]: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`claroline_path`.`innova_stepcondition_criteriagroup`, CONSTRAINT `FK_F33A94EA727ACA70` FOREIGN KEY (`parent_id`) REFERENCES `innova_stepcondition_criteriagroup` (`id`))
所以,我已经阅读了this我们的this one之类的帖子,建议的解决方法是使用onDelete =" SET NULL"在ManyToOne方面的joinColumn,我做了。但我仍然得到这个错误。
可能有什么不对? 谢谢
编辑:
@RaulFerriz:谢谢你的回答。如果我尝试修改:使用cascade = {" persist"}而不是标准中的cascade = {" all"},我仍然会遇到相同的错误。
但如果我完全删除Criterion中的级联,我有:
A new entity was found through the relationship \u0027Innova\\PathBundle\\Entity\\Criterion#criteriagroup\u0027 that was not configured to cascade persist operations for entity: Innova\\PathBundle\\Entity\\Criteriagroup@0000000034dfa7b200000000f76198d8. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={\u0022persist\u0022}). If you cannot find out which entity causes the problem implement \u0027Innova\\PathBundle\\Entity\\Criteriagroup#__toString()\u0027 to get a clue`
这似乎意味着需要cascade = {" persist"}。
我不知道下一步该尝试什么。 我做了一个学说:schema:每次修改后都会更新。
答案 0 :(得分:3)
您的问题不在您的关系标准组和标准中。
如果检查SQL错误,则失败的约束是针对字段parent_id
的。这是您的Criteriagroup / Criteriagroup关系的一部分。
如果其他人需要这个,那么我就把你的错误关系的定义放在这里:
/**
* Parent criteriagroup
* @var \Innova\PathBundle\Entity\Criteriagroup
*
* @ORM\ManyToOne(targetEntity="Criteriagroup", inversedBy="children", cascade={"all"})
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
*/
protected $parent;
/**
* Children criteriagroup
* @var \Doctrine\Common\Collections\ArrayCollection
*
* @ORM\OneToMany(targetEntity="Criteriagroup", mappedBy="parent", indexBy="id", cascade={"persist", "remove"})
* @ORM\OrderBy({"order" = "ASC"})
*/
protected $children;
为了使这项工作,您需要替换:
@ORM\JoinColumn(name="parent_id", referencedColumnName="id")
通过
@ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
通过添加此项,当您删除CriteriaGroup时,将删除所有子CriteriaGroup。如果您不想删除儿童,只需添加onDelete="SET NULL"
。
希望它有所帮助。
答案 1 :(得分:0)
正如您已定义实体一样,当您尝试删除"标准"实体Criteriongroup也将被删除。这不是你想要实现的目标。
试试这个
/**
* Criterion
*
* @ORM\Table(name="innova_stepcondition_criterion")
* @ORM\Entity(repositoryClass="Innova\PathBundle\Repository\CriterionRepository")
*/
class Criterion implements \JsonSerializable
{
/**
* Criteriagroup
* @var \Innova\PathBundle\Entity\Criteriagroup
*
* @ORM\ManyToOne(targetEntity="Innova\PathBundle\Entity\Criteriagroup", inversedBy="criteria")
* @ORM\JoinColum(referencedColumnName="id")
*/
protected $criteriagroup;
}
而且这个
/**
* Criteriagroup
*
* @ORM\Table(name="innova_stepcondition_criteriagroup")
* @ORM\Entity(repositoryClass="Innova\PathBundle\Repository\CriteriagroupRepository")
*/
class Criteriagroup implements \JsonSerializable
{
/**
* Criteria linked to the criteriagroup
* @var \Doctrine\Common\Collections\ArrayCollection
*
* @ORM\OneToMany(targetEntity="Innova\PathBundle\Entity\Criterion", mappedBy="criteriagroup", indexBy="id", cascade={"persist", "remove"})
*/
protected $criteria;
}
基本上,将Criterion实体从级联中清除,最多我认为你需要{cascade="persist"}
在这个实体上,这意味着:当Criterion持久存在时,还要坚持与之相关的Criteriagroup。