Невозможно удалить или обновить нарушение ограничения родительской строки с помощью каскадного удаления - PullRequest
0 голосов
/ 02 марта 2019

У меня есть 2 объекта: Информация и Возможный ответ Информация может рассматриваться как вопрос, в зависимости от его типа, он может иметь Возможный ответ .Он также может иметь дочерний элемент Информация , если родительский элемент Информация имеет Возможный ответ , один из них вызовет дочерний дипслай.

Информация класс:

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

Возможный ответ класс:

/**
 * @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. Одиночная информация: OK
  2. Информация с ребенком Информация: OK
  3. Информация с возможными ответами: OK
  4. Информация с возможными ответами, вызывающими ребенка Информация: КО
  5. Информация с ребенком Информация с возможными ответами: КО

В случае 4:

Возникла исключительная ситуация при выполнении команды "УДАЛИТЬ ИЗ ВОЗМОЖНОГО_ОБЪЕКТА WHERE id =?"с параметрами [28]:

SQLSTATE [23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (evisa. information, CONSTRAINT FK_297918835FDDDCD6 FOREIGN KEY(trigger_id) ССЫЛКИ possible_answer (id))

В случае 5:

Возникла исключительная ситуация при выполнении операции «УДАЛИТЬ ИЗ ИНФОРМАЦИИ», ГДЕ id =?'с параметрами [56]:

SQLSTATE [23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (db. possible_answer, CONSTRAINT FK_3D79739D2EF03101 FOREIGN KEY(information_id) ССЫЛКИ information (id))

Мне не хватает чего-то в моем каскадировании, чтобы удалить все правильно, но я не могу найти, что это такое.

1 Ответ

0 голосов
/ 03 марта 2019

Вы используете каскады уровня 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 некоторые snake_case.

...