Как использовать параметр 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;