Lehre ManyToMany: Entfernen eines Objekts

8

Ich habe ein Problem mit der unidirektionalen ManyToMany-Beziehung in Doctrine. Der Fall ist sehr einfach: Produkt hat viele Tags. Das Tag kann an das Produkt angehängt werden, aber auch an jede "taggable" Entität in meinem Modell. Hier ist ein Ausschnitt meines Codes:

%Vor%

Da sein unidirektionaler Beziehungscode der Tag-Klasse weggelassen wird.

Für eine solche definierte Assoziation hat Doctrine den folgenden SQL-Code generiert (SQL für die Tabelle products und Tags wird übersprungen):

%Vor%

Ich möchte ein Produkt entfernen, das mit Tags versehen ist.

%Vor%

Offensichtlich fehlgeschlagen aufgrund von Integritätseinschränkungsverletzung ("Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl ( products_tags , CONSTRAINT FK_E3AB5A2CBAD26311 FREMDSCHLÜSSEL ( tag_id ) REFERENCES tags ( id )) "").

Wenn ich die Tabelle products_tags ändere, die ON DELETE CASCADE zu Fremdschlüsseln hinzufügt, funktioniert es wie ich will. Ich kann TAG ($ em- & gt; entfernen ($ tag)) und PRODUCT ($ em- & gt; entfernen ($ product), das referenzierte Zeilen automatisch aus der products_tags-Tabelle entfernt, leicht entfernen.

Wie sollte mein Code aussehen, um products_tags-Tabelle mit ON CASCADE DELETE-Fremdschlüsseln zu erhalten? Ich bin schon müde mit cascade = {"all"}, aber es ist fehlgeschlagen.

Ich weiß, ich kann alle Tags aus der Tagsammlung des Produkts entfernen, aber wie ich bereits erwähnt habe, möchte ich es in einem Schritt erreichen, indem ich die Methode remove des Entity Manager-Objekts aufruft.

Hat Lehre wirklich davon?

    
biera 28.09.2013, 16:42
quelle

1 Antwort

23

Ok, ich habe es geschafft, Doctrine2 Dokumente zu durchsuchen;) Die Lösung besteht darin, onDelete="cascade" zu @JoinColumn hinzuzufügen.

%Vor%

Beachten Sie, dass cascade = {"all"} auf Objektebene (in Ihrer App) verwaltet wird, während onDelete="cascade" auf Datenbankebene ist.

    
biera 28.09.2013, 17:25
quelle

Tags und Links