Ich habe eine übergeordnete Entität Kategorie und eine untergeordnete Entität Artikel. Sie werden durch eine ManyToMany-Beziehung definiert. Ein Artikel kann in einer oder mehreren Kategorien aufgeführt werden und jede Kategorie kann in mehr als einem Artikel getaggt werden.Löschen von Entitäten in Kaskade funktioniert nicht in ManyToMany-Beziehung
, was ich tun TRY
ich möchte, wenn ich eine Kategorie löschen, alle Artikel in der Kategorie getaggt werden auch gelöscht, aber nur, wenn sie von einer anderen Kategorie nicht markiert sind.
was ich schon
GETESTET I mit 2 Kategorie getestet (ID = 1 und ID = 2) und mit zwei Artikeln (ID = 71 und id = 91). Artikel 71 hat sowohl der Kategorie 1 und 2. Artikel 91 nur mit der Kategorie 2.
So verknüpft ist, wenn Kategorie löschen 2 Ich erwarte, dass Artikel 91 löschen, aber nicht Artikel 71 (als dieser noch mit category_1 verknüpft ist)
aber keines dieser happenned, was ich versuchte, ...
im folgendes Bild ich aufsummiert, was ich mit unterschiedlichen Strategien (1/Kaskade = { „entfernen“}, 2/orphanRemoval = true und 3/ondelete = "CASCADE").
In grün die Entfernung aus der Datenbank.
MY CODE (Teil von CODE)
im Controller
public function deleteCategory(Category $category)
{
$em = $this->getDoctrine()->getManager();
$em->remove($category);
$em->flush();
}
für Strategie 1/cascade = { "entfernen"}
// 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;
für Strategie 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;
für Strategie 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;
meine Frage
gibt es eine andere Möglichkeit, es zu tun, aber die 3 Strategien, die ich bereits ausprobiert habe, oder diese Entfernungen müssen in der Steuerung durchgeführt werden?
ok Waaghals Ich werde Ereignisse versuchen oder es direkt im Controller tun (nichts falsch daran, es direkt in der Steuerung zu tun? ** richtig **?) –
@aleqxs Nö nichts falsch damit. – Waaghals