Symfony 2.7, каскадное удаление Doctrine

#symfony #doctrine-orm

#symfony #doctrine-orm

Вопрос:

Я пытаюсь использовать доктрину cascade={"remove"} , но она не работает.

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

Вот мой код :

Объект объявляет :

 /**
 * Announce
 *
 * @ORMTable()
 * @ORMEntity(repositoryClass="AppBundleEntityAnnounceAnnounceRepository")
 */
class Announce
{
    /**
     * @ORMOneToOne(targetEntity="AppBundleEntityAnnouncePictureAnnounce", inversedBy="coverAnnounce")
     * @ORMJoinColumn(name="cover_picture_id", referencedColumnName="id", nullable=true)
     */
    private $coverPicture; 

    /**
     * @ORMOneToMany(targetEntity="AppBundleEntityAnnouncePictureAnnounce", mappedBy="announce", cascade={"remove"})
     */
    private $pictureAnnounces; 
}
  

Объект pictureAnnounce :

 /**
 * AppBundleEntityAnnouncePictureAnnounce
 *
 * @ORMTable(name="picture_announce")
 * @ORMEntity(repositoryClass="AppBundleEntityAnnouncePictureAnnounceRepository")
 * @ORMHasLifecycleCallbacks
 */
class PictureAnnounce
{
    /**
     * @ORMOneToOne(targetEntity="AppBundleEntityAnnounceAnnounce", mappedBy="coverPicture", cascade={"persist"})
     */
    private $coverAnnounce;

    /**
     * @var Announce $announce
     *
     * @ORMManyToOne(targetEntity="AppBundleEntityAnnounceAnnounce", inversedBy="pictureAnnounces")
     * @ORMJoinColumn(name="announce_id", referencedColumnName="id", nullable=false)
    */
    private $announce;
  

Код для удаления (я установил coverPicture равным null, чтобы при удалении не возникло ошибки внешнего ключа)

 $announce->setCoverPicture(null);
$em->flush();
$em->remove($announce);
$em->flush();
  

Но у меня ошибка во внешнем ключе

SQLSTATE[23000]: нарушение ограничения целостности: 1451 Не удается удалить или обновить родительскую строку: сбой ограничения внешнего ключа

PS: Я не могу найти, как правильно отобразить мой код: s

PS: Это обходное решение работает, но разве не так работает каскад?

 if(count($announce->getPictureAnnounces()) > 0) { 
   $pictureAnnounces = $announce->getPictureAnnounces();
   foreach ($pictureAnnounces as $pictureAnnounce) { 
     $em->remove($pictureAnnounce);
   }
   $em->flush(); 
} // Then remove the announce
  

Комментарии:

1. Вы пытались добавить orphanRemoval=true в свой объект announce также в свой дочерний объект добавить , onDelete="CASCADE" схему обновления вашей БД, а затем попытаться удалить родительский объект

2. С OnDelete=»CASCADE» это работает (не нужно удаление сирот (я нашел его, но, как я понимаю, документация — это не то, что мне здесь нужно)). Я немного удивлен, что мой код не работает для удаления. Мне кажется логичным, что с OnDelete это работает, потому что мы работаем непосредственно с БД. Есть идеи, почему только с ORM это не удается?