Cascade remove - wie geht das?

  • oliver_g oliver_g
    R2-D2
    0 x
    71 Beiträge
    0 Hilfreiche Beiträge
    19. 07. 2011, 16:43

    Hallo,

    ich habe trotz der entsprechenden Annotation: @cascade remove bei bestimmten Properties keinen Erfolg beim automatischen Löschen. Wenn ich also das oberste Objekt mittels $repository->remove($object) lösche, werden die Kindobjekte (Relationen) nicht mit gelöscht.

    Hat da jemand schon Erfahrung mit? Oder muss ich alles manuell durcheiern und löschen? Für das löschen der Relationen-Links in den mm-Tabellen habe ich ja auch noch keine Lösung gefunden (zumindestens keine elegante).

    Danke schon mal für passende Hinweise.


  • 1
  • Eydamos Eydamos
    Padawan
    0 x
    54 Beiträge
    0 Hilfreiche Beiträge
    19. 07. 2011, 17:04

    Ich habe mir das ehrlichgesagt noch nicht angesehen mit der cascade in TYPO3.

    Aber ich weiß, dass MySQL das von alleine kann, wenn die Tabellen entsprechend angelegt sind. Beim anlegen der Tabellen (ext_tables.sql) legst du ja auch fest was Primärschlüssel usw. ist und es gibt auch einen Befehl der das löschen von primär und fremd Datensätzen mit einbezieht.

    Schlüsselwort ist hier DELETE CASCADE siehe hier:
    MySQL 5.1 Referenzhandbuch 14.2.6.4. Fremdschlüssel-Beschränkungen

    Wobei der constraint erst beim wirklichen löschen des Datensatzes ausgeführt wird. Sprich wenn TYPO3 deleted = 1 setzt interessiert das MySQL nicht, erst wenn der Datensatz entgültig gelöscht wird wird auch das Kindelement mit gelöscht. Von daher weiß ich nicht wie hilfreich das bei TYPO3 ist.

  • oliver_g oliver_g
    R2-D2
    0 x
    71 Beiträge
    0 Hilfreiche Beiträge
    19. 07. 2011, 17:14

    Ja, das ist es ja gerade, es wird ja nur auf deleted = 1 gesetzt.
    Hmm, dann werde ich das wohl manuell lösen müssen. Schade, dass Extbase noch recht unausgereift ist.

  • ToBe ToBe
    Padawan
    0 x
    44 Beiträge
    0 Hilfreiche Beiträge
    10. 02. 2012, 13:07

    DELETE CASCADE in der DB und @cascade remove als Annotation im Model sind aber 2 Paar Schuhe...

    @cascade remove wird sehr Wohl beim Löschen eines Objectes wiksam - egal was die Abstaktionsschicht dann mit dem gelöschten Objekt macht.

    Wenn ein Datensatz in der DB deletet=1 hat, dann ist er für den Objektmanager gelöscht.

    @oliver_g: du hast geschrieben: "bei bestimmten Properties" - um was für Beziehungen handelt es sich denn da.

    (Ich frag und klink mich hier ein, weil ich selber das Problem habe, dass Kindobjekte nicht gelöscht werden)

  • ToBe ToBe
    Padawan
    0 x
    44 Beiträge
    0 Hilfreiche Beiträge
    22. 05. 2012, 17:33

    Ich glaube, dass es ein Modellierungsproblem ist.

    Entweder es liegt an am Objekt-Typ "Entity", oder daran, dass die Domain-Klasse ein "aggregate root" ist.
    Dann werden sie nicht mitgelöscht.

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    0 Hilfreiche Beiträge
    03. 09. 2012, 17:24

    Ich habe bei meinem Lernprojekt das selbe Problem, irgendwie habe ich die Models nicht richtig strukturiert, das automatische Löschen per @cascade remove funktioniert nicht.

    Meine Domäne sieht in etwa so aus:

    Es gibt Companies, Branches und Functions
    Companies haben Locations und Employees
    Locations haben Branches
    Employees haben Functions und eine Beziehung zu einer Location.
    Functions sind per mm an Employees gebunden und Branches per mm an Locations.

    Sinnhaftigkeit sei dahingestellt, es geht mir nur um das Kennenlernen von Extbase.

    Wenn ich nun eine Location lösche sollen auch die Employees gelöscht werden.
    Lösche ich eine Company sollen die Locations und somit auch die Employees gelöscht werden.
    Lösche ich eine Location sollen auch die Beziehungen aus der MM Tabelle gedropt werden.
    Lösche ich einen Employee sollen auch die Beziehungen aus der MM Tabelle gedropt werden.

    Meine Annotations sehen so aus (Beispiel aus dem Location Model):

    1. /**
    2.  * @var Tx_Extbase_Persistence_ObjectStorage<Tx_TestCompany_Domain_Model_Employee>
    3.  * @lazy
    4.  * @cascade remove
    5.  */
    6. protected $employees;

    Meine Objekte sind alle wie folgt definiert:

    1. class Tx_TestCompany_Domain_Model_Location extends Tx_Extbase_DomainObject_AbstractEntity {}
    2. class Tx_TestCompany_Domain_Model_Company extends Tx_Extbase_DomainObject_AbstractEntity {}
    3. class Tx_TestCompany_Domain_Model_Branch extends Tx_Extbase_DomainObject_AbstractEntity {}
    4. class Tx_TestCompany_Domain_Model_Employee extends Tx_Extbase_DomainObject_AbstractEntity {}
    5. class Tx_TestCompany_Domain_Model_Function extends Tx_Extbase_DomainObject_AbstractEntity {}

    Also alles AbstractEntities.

    Irgendwo habe ich etwas vergessen oder nicht berücksichtigt, jedenfalls funktioniert @cascade remove nicht.

  • ToBe ToBe
    Padawan
    0 x
    44 Beiträge
    0 Hilfreiche Beiträge
    30. 10. 2012, 16:18

    wenn ich die @lazy Annotation entferne funtoniert das @cascade remove ...

    ...macht meine Erachtens nicht besonders viel Sinn ;-) naja

    (getestet mit einer 1-1 Beziehung)

  • 1