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