У меня есть родительская сущность Категория и статья дочернего субъекта. Они определяются отношением ManyToMany. Одна статья может быть представлена в одной или нескольких категориях, и каждая категория может быть помечена более чем в одной статье.
ЧТО Я ПЫТАЮСЬ ДЕЛАТЬ
Я хотел бы, чтобы при удалении категории каждая статья, помеченная в категории, также удалялась, но только если они не помечены другой категорией.
ЧТО Я УЖЕ ИСПЫТАЛ
Я тестировал 2 категории (id = 1 и id = 2) и с двумя статьями (id = 71 и id = 91). статья 71 имеет как категории 1, так и 2. Статья 91 связана только с категорией 2.
Поэтому при удалении категории 2 я ожидаю удалить статью 91, но не статью 71 (так как эта связь все еще связана с категорией_1)
Но ничего из этого не случилось, что я пробовал …
На следующем рисунке я подвел итог тому, что я использую для разных стратегий (1 / cascade = {"remove"}, 2 / orphanRemoval = true и 3 / ondelete = "CASCADE").
В зеленом виде удаление из базы данных.
МОЙ КОД (ЧАСТЬ КОДА)
в контроллере
public function deleteCategory(Category $category) { $em = $this->getDoctrine()->getManager(); $em->remove($category); $em->flush(); }
для стратегии 1 / cascade = {"remove"}
// IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION * @ORM\ManyToMany(targetEntity="Article", inversedBy="categories", cascade={ "remove"}) private $articles; // IN CLASS/ENTITY ARTICLE * @ORM\ManyToMany(targetEntity="Category", mappedBy="articles") private $categories;
для стратегии 2 / orphanRemoval = true
// IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION * @ORM\ManyToMany(targetEntity="Article", inversedBy="categories", orphanRemoval=true) private $articles; // IN CLASS/ENTITY ARTICLE * @ORM\ManyToMany(targetEntity="Category", mappedBy="articles") private $categories;
для стратегии 3 / onDelete = "CASCADE"
// IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION * @ORM\ManyToMany(targetEntity="Article", inversedBy="categories") private $articles; // IN CLASS/ENTITY ARTICLE * @ORM\ManyToMany(targetEntity="Category", mappedBy="articles") * @ORM\JoinColumn(onDelete="CASCADE") private $categories;
МОЙ ВОПРОС
есть ли другой способ сделать это, но три стратегии, которые я уже пробовал, или эти удаления должны быть сделаны в контроллере?
Вы не можете сделать это, используя только каскадные функции, насколько я могу себе представить.
preRemove
решением будет создание слушателя, который подписывается на события preRemove
. Затем вы можете проверить, когда удалена категория, и найти все статьи из этой категории, которые не имеют других категорий и удаляют их.