При попытке удалить сущность, я получаю нарушение внешнего ограничения, содержащее однонаправленные ассоциации «один ко многим». У меня есть следующий простой класс:
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», позаботится об этом для меня.
Если я изменяю ассоциацию на двунаправленную связь, она работает. Почему это не работает с однонаправленными ассоциациями?
Используйте параметр базы данных onDelete с помощью Doctrine
@ORM\JoinColumn(name="dealer_id", referencedColumnName="id", onDelete="SET NULL")
объяснение отсюда :
SET NULL устанавливает значение столбца в NULL, когда родительская строка уходит.
RESTRICT приводит к сбою попытки DELETE родительской строки.
… обновлять схему базы данных до того, как она жалуется, что она не работает 🙂
app/console doctrine:schema:update --force
если это не работает из-за ошибок внешнего ключа, перейдите на жесткий путь (в этом порядке):