Как использовать параметр каскада в Symfony2 Doctrine?

Я пытаюсь понять параметр cascade в Доктрина в Symfony2.

Я хотел бы иметь возможность удалить дочерний объект (и не запускать ошибку ограничения внешнего ключа.)

У меня есть 3 объекта:

Отчет

/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $responses;

/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $sms;

ответ

/**
 * @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
 */
protected $report;

SMS

/**
 * @ORM\ManyToOne(targetEntity="Report")
 */
protected $report;

Теперь я хотел бы удалить объект Response, но я получаю

SQLSTATE [23000]: Нарушение ограничения целостности: 1451 Не удается удалить или обновить родительскую строку:
ограничение внешнего ключа завершается с ошибкой (mybundle. sms, CONSTRAINT FK_B0A93A77BB333E0D ИНОСТРАННЫЙ КЛЮЧ (reportId) ССЫЛКИ report (id))

Где я могу использовать опцию cascade и какую опцию использовать (detach или remove)?

Я могу сделать много проб и ошибок, чтобы понять это, но я надеялся на экспертное объяснение, поэтому я ничего не забываю.

Ответы

Ответ 1

Попробуйте использовать

/**
 * @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
 * @ORM\JoinColumn(name="reportId", referencedColumnName="id", onDelete="CASCADE")
 */
protected $report;

И затем обновите yor-схему. Он добавит каскадный уровень базы данных

Ответ 2

Ответ на Ziumin

используя параметр onDelete для ORM JoinColumn

работал, когда вы хотите удалить дочерний элемент (Owning Side).

Но если вы хотите удалить Response, который является родительским элементом (Обратная сторона), это когда cascade приходит в удобном виде. В объекте Report я добавил следующее для каждой из своих коллекций (отношения OneToMany):

Отчет

/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"remove"})
*/
protected $responses;

/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"remove"})
*/
protected $sms;

Теперь, когда я удаляю Report, он удаляет все связанные записи в таблицах Response и SMS.

Ответ 3

Вы также можете использовать cascade=all для обновления всех действий.

Отчет

 /**
 * @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"all"})
 */
protected $responses;

 /**
 * @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"})
 */
protected $sms;