Как я могу использовать опцию каскад в 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)?



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

3 ответов:

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

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

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

Ответ Зюмина

Используя опцию onDelete для ORM JoinColumn

Метод работает, когда вы хотите удалить дочерний элемент (владеющая сторона ).

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

Отчет

/**
* @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;

Comments

    Ничего не найдено.