2014-12-16 11 views
5

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.

enter image description here

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?

Antwort

0

Sie können dies nicht tun, nur Cascading-Funktionen, soweit ich mir vorstellen kann.

Eine saubere Lösung wäre, einen Listener zu erstellen, der die preRemove Ereignisse abonniert. Sie können dann prüfen, wann eine Kategorie gelöscht wird und alle Artikel aus dieser Kategorie finden, die keine anderen Kategorien haben, und diese auch entfernen.

+0

ok Waaghals Ich werde Ereignisse versuchen oder es direkt im Controller tun (nichts falsch daran, es direkt in der Steuerung zu tun? ** richtig **?) –

+0

@aleqxs Nö nichts falsch damit. – Waaghals

Verwandte Themen