无法使用级联删除来删除或更新父行约束冲突

时间:2019-03-02 18:30:49

标签: symfony orm doctrine-orm model symfony4

我有2个实体:信息 PossibleAnswer 信息可视为一个问题,具体取决于其类型,它可能具有可能的答案。它还可以有一个子 Information ,如果父 Information 具有 PossibleAnswers ,则其中之一将触发子Dipslay。

信息类:

/**
 * @ORM\Entity(repositoryClass="App\Repository\InformationRepository")
 */
class Information
{

    use DateTrait;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string")
     * @Assert\NotBlank()
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(type="string")
     * @Assert\NotBlank()
     */
    private $type;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\PossibleAnswer", mappedBy="information", cascade={"persist", "remove"}, orphanRemoval=true)
     */
    private $possibleanswers;

    /**
     * One Information has Many Informations.
     * @ORM\OneToMany(targetEntity="Information", mappedBy="parent", cascade={"remove"}, orphanRemoval=true)
     * @ORM\OrderBy({"rank" = "ASC"})
     */
    private $children;

    /**
     * Many Informations have One Information.
     * @ORM\ManyToOne(targetEntity="Information", inversedBy="children")
     */
    private $parent;

    /**
     * réponse qui déclenche une sous question
     * @ORM\ManyToOne(targetEntity="PossibleAnswer")
     */
    private $trigger;

PossibleAnswer 类:

/**
 * @ORM\Entity(repositoryClass="App\Repository\PossibleAnswerRepository")
 */
class PossibleAnswer
{

    use DateTrait;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Information", inversedBy="possibleanswers")
     */
    private $information;

    /**
     * @var string
     *
     * @ORM\Column(type="string")
     * @Assert\NotBlank()
     */
    private $value;

现在,我想删除特定的信息,并删除所有可能的答案或子信息。但是某些删除案例不起作用:

  1. 单一信息:确定
  2. 带孩子的信息:确定
  3. 可能回答的信息:确定
  4. 有关可能触发孩子的答案的信息信息: KO
  5. 有关儿童的信息可能的答案: KO

第4种情况:

  

执行“ DELETE FROM可能性_answer”时发生异常   id =?'带有参数[28]:

     

SQLSTATE [23000]:违反完整性约束:1451无法删除或   更新父行:外键约束失败   ({evisainformation,约束FK_297918835FDDDCD6外键   ({trigger_id)参考文献possible_answerid))

情况5:

  

在执行“ DELETE FROM information WHERE”时发生异常   id =?'带有参数[56]:

     

SQLSTATE [23000]:违反完整性约束:1451无法删除或   更新父行:外键约束失败   ({dbpossible_answer,约束FK_3D79739D2EF03101外国   KEY(information_id参考(informationid))

我在级联中丢失了一些东西,无法正确删除所有内容,但是我找不到它。

1 个答案:

答案 0 :(得分:2)

您正在使用ORM级别级联,您要尝试实现的是数据库级别级联http://www.inanzzz.com/index.php/post/6s4g/one-to-many-association-cascade-example-with-doctrine-annotations 您需要的是onDelete="CASCADE" 例如: /** * @ORM\ManyToOne(targetEntity="App\Entity\Information", inversedBy="possibleanswers") * @JoinColumn(onDelete="CASCADE") */ private $information; 始终使用JoinColumn,您将可以更好地控制代码并手动命名列,否则最终将导致数据库混乱,某些名称将是CamelCase,某些是蛇形。