Как использовать параметр cascade в доктрине 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. Он добавит каскадный уровень базы данных
Ziumin это!--10-->
С помощью на
ORM JoinColumn
метод работал, когда вы хотите удалить элемент ребенка (Владея Сторону).
а если вы хотите удалить Response
который является родительским элементом (Обратная Сторона), это когда cascade
пригодится. В Report
entity я добавил следующее Для каждой из своих коллекций (OneToMany отношения):
отчет
/**
* @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;