Doctrine2 – невозможно удалить объект с однонаправленным отношением oneToMany

При попытке удалить сущность, я получаю нарушение внешнего ограничения, содержащее однонаправленные ассоциации «один ко многим». У меня есть следующий простой класс:

class Dealer{ /** * @ManyToMany(targetEntity="Car", cascade={"persist", "remove"}) * @JoinTable(name="dealer_cars", * joinColumns={@JoinColumn(name="dealer_id", referencedColumnName="id")}, * inverseJoinColumns={@JoinColumn(name="car_id", referencedColumnName="id", unique=true)} * ) **/ protected cars; } 

Объект Car не должен содержать отношения к его владельцу в этом случае (отсюда однонаправленное отношение). Если я попытаюсь удалить объект Dealer содержащий ассоциации с машинами, я получаю следующее ограничение ограничений:

 Cannot delete or update a parent row: a foreign key constraint fails (`application`.`dealer_cars`, CONSTRAINT `FK_E1BCEEEBC3C6F69F` FOREIGN KEY (`car_id`) REFERENCES `car` (`id`))' 

Я получил бы такое же сообщение, если бы попытался удалить строку дилера вручную из таблицы базы данных, но я подумал, что Doctrine, используя cascade = «remove», позаботится об этом для меня.

Если я изменяю ассоциацию на двунаправленную связь, она работает. Почему это не работает с однонаправленными ассоциациями?

Related of "Doctrine2 – невозможно удалить объект с однонаправленным отношением oneToMany"

Используйте параметр базы данных onDelete с помощью Doctrine

 @ORM\JoinColumn(name="dealer_id", referencedColumnName="id", onDelete="SET NULL") 

объяснение отсюда :

  • CASCADE будет распространять изменения при изменении родительского элемента. (Если вы удалите строку, строки в файлах с ограничениями, которые ссылаются на эту строку, также будут удалены и т. Д.)
  • SET NULL устанавливает значение столбца в NULL, когда родительская строка уходит.

  • RESTRICT приводит к сбою попытки DELETE родительской строки.


обновлять схему базы данных до того, как она жалуется, что она не работает 🙂

 app/console doctrine:schema:update --force 

если это не работает из-за ошибок внешнего ключа, перейдите на жесткий путь (в этом порядке):

  • Доктрина приложения / консоли: база данных: падение
  • Доктрина приложения / консоли: база данных: создать
  • app / console doctrine: schema: update –force
  • (необязательно: app / console doctrine: fixtures: load)