Как я могу использовать опцию каскад в Symfony2 доктрине?
Я пытаюсь понять cascade вариант в доктрине в Symfony2.
Я хотел бы иметь возможность удалить дочернюю сущность (и не вызывать ошибку ограничения внешнего ключа.)
У меня есть 3 сущности:
Отчет
/**
* @ORMOneToMany(targetEntity="Response", mappedBy="report")
*/
protected $responses;
/**
* @ORMOneToMany(targetEntity="Response", mappedBy="report")
*/
protected $sms;
Ответ
/**
* @ORMManyToOne(targetEntity="Report", inversedBy="responses")
*/
protected $report;
SMS
/**
* @ORMManyToOne(targetEntity="Report")
*/
protected $report;
Теперь я хотел бы удалить сущность Response, но я получаю
SQLSTATE[23000]: целостность нарушение ограничений: 1451 не удается удалить или обновить родительскую строку:
ограничение внешнего ключа завершается ошибкой (mybundle.sms, ОГРАНИЧЕНИЕFK_B0A93A77BB333E0DВНЕШНИЙ КЛЮЧ (reportId) ССЫЛКИreport(id))
Где я использую опцию cascade и какую опцию я должен использовать (detach или remove)?
Я могу сделать много проб и ошибок, чтобы выяснить это, но я надеялся на экспертное объяснение, поэтому я не упускаю кое-что.
3 ответов:
Попробуйте использовать
/** * @ORM\ManyToOne(targetEntity="Report", inversedBy="responses") * @ORM\JoinColumn(name="reportId", referencedColumnName="id", onDelete="CASCADE") */ protected $report;И затем обновить yor схему. Это добавит каскадирование уровня базы данных
Ответ Зюмина
Используя опцию
onDeleteдляORM JoinColumnМетод работает, когда вы хотите удалить дочерний элемент (владеющая сторона ).
Но если вы хотите удалитьResponse, который является родительским элементом ( обратная сторона), это когдаcascadeпригодится. В сущностиReportя добавил следующее Для каждой из ее коллекций (OneToMany Relations):Отчет
/** * @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"remove"}) */ protected $responses; /** * @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"remove"}) */ protected $sms;Теперь, когда я удаляю
Report, он удаляет все связанные с ней записи в таблицахResponseиSMS.
Вы также можете использовать
cascade=allдля обновления всех действий.Отчет
/** * @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"all"}) */ protected $responses; /** * @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"}) */ protected $sms;
Comments