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