Обработка нарушения ограничения целостности с помощью Doctrine - PullRequest
0 голосов
/ 24 октября 2018

Я знаю, что есть аналогичные вопросы о SO, но я не нашел ответа на этот вопрос.

Когда я пытаюсь удалить сущность класса EntityA, которая имеет связь oneToMany с другим классомEntityB и EntityB связано с EntityA Я получаю следующую ошибку:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`example_table`.`entity_b`, CONSTRAINT `FK_CAC822D9B8F92CD8` FOREIGN KEY (`entity_a_id`) REFERENCES `entity_a` (`id`))

(я изменил имена реальных сущностей на EntityA и EntityB)

Я попытался настроить Doctrine для установки внешней стороны на стороне-владельце этого отношения на NULL через настройку cascade.Но я думаю, потому что я использую его на не-владеющей стороне , он не работает.Но я не уверен, что это так.

EDIT : на самом деле я действительно не уверен, что еще должен делать параметр cascade: detach, если он установлен на стороне владельца.Возможно, мне не хватает некоторого понимания основ доктрины ...

Я знаю, что есть SQL-триггеры (которые могут выполнять операции над событиями удаления и т. Д.), А также способ настроить доктрину для их настройки, но я бы хотелхотел бы сохранить эту логику в своем коде приложения.

Я также хотел бы избежать итерации по коллекциям, проверять, установлены ли отношения, а затем устанавливать их на NULL по соображениям производительности.

Что я делаю неправильно?Как избежать возникшей ошибки?

Вот два соответствующих определения сопоставления в классах сущностей:

EntityA

class EntityA {
    /**
      * @ORM\OneToMany(targetEntity="EntityB", mappedBy="entityA", cascade={"detach"})
     */
    private $entityBs;
}

EntityB

class EntityB {
  /**
   * @ORM\ManyToOne(targetEntity="EntityA", inversedBy="entityB")
   */
  private $entityA;
}

1 Ответ

0 голосов
/ 24 октября 2018

Попробуйте ниже:

/**
 * @ORM\OneToMany(targetEntity="EntityB", mappedBy="entityA", cascade={"remove"})
 */
protected $entityBs;

и

/**
 * @ORM\ManyToOne(targetEntity="EntityA", inversedBy="entityB")
 * @ORM\JoinColumn(name="entityA_id", referencedColumnName="entityB_id", nullable=true, onDelete="SET NULL")
 */
protected $entityA;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...