2013-09-05 9 views
5

ich alle abhängigen rable RekordLöschen Multi-Level in CakePHP (Kette löschen)

Mein Verein

Niederlassung Modell

var $hasMany =array(
    'Dealbranch' => array(
     'className' => 'Dealbranch', 
     'foreignKey' => 'DLB_BR_ID', 
     'dependent' =>true 
    ) 
); 

Dealbranch Modell

var $belongsTo = array(
    'Deal' => array(
     'className' => 'Deal', 
     'foreignKey' => 'DL_ID', 
     'dependent' => true 
    ), 
    'Branch' => array(
     'className' => 'Branch', 
     'foreignKey' => 'DLB_BR_ID', 
    ) 
); 
löschen möchten

Deal Modell

var $hasMany = array(
    'Dealbranch' => array(
     'className' => 'Dealbranch', 
     'foreignKey' => 'DLB_DL_ID', 
    ) 
); 

In Controller ich verwendet habe

$this->Branch->delete($id,true); 

hier Jetzt whem I-Zweig am löschen, so abhängig dealbranch erfolgreich gelöscht, aber keiner von jedem Deal Datensatz gelöscht

Ich mag like: wenn ich Zweigstelle lösche, sollten alle abhängigen dealbranch gelöscht werden und alle abhängigen (abhängig von dealbranch) Geschäftsdatensätze sollten gelöscht werden

hier ist Deal Kind von Dealbranch und Dealbranch ist Kind von Zweig

Nun, für einen Zweig gibt es mehrere Datensatz in Dealbranch, und für mehrere Dealbranch gibt es einen Datensatz in Deal

enter image description here

Bitte Hilf mir. Ich benutze CakePHP 2

Antwort

0

Alle Modell Datensätze, die mit Branch zugeordnet sind, können durch die Verwendung

$this->Branch->delete($id,true);

Ich denke, gelöscht werden, wenn Sie das Geschäft Aufzeichnungen über das Löschen von Zweig Datensätze entfernen möchten dann Ihr Modell Branch sollte Deal Modell zugeordnet werden.

Versuchen Sie einfach, wie diese

Niederlassung Modell

var $hasMany =array(
    'Dealbranch' => array(
     'className' => 'Dealbranch', 
     'foreignKey' => 'DLB_BR_ID', 
     'dependent' =>true 
    ), 
    'Deal' => array(
     'className' => 'Deal', 
     'foreignKey' => 'your_foriegn_key', 
     'dependent' =>true 
    ) 

); 

oder Sie versuchen, wie diese

-Update kann hinzufügen:

Entsprechend Ihrer Anforderung hier Deal ist ein Kind von Dealbranch und De Albranch ist Kind des Zweiges Ihre Modellassoziationen sollten so sein.

Deal Branch-Modell sollte so sein.

DealBranch Modell

var $belongsTo = array(
    'Branch' => array(
     'className' => 'Branch', 
     'foreignKey' => 'DLB_BR_ID', 
    ) 
); 
var $hasMany = array(
    'Deal' => array(
     'className' => 'Deal', 
     'foreignKey' => 'DL_ID', 
     'dependent' => true 
    ), 
); 

Deal Modell so sein sollte.

Deal Modell

var $belongsTo = array(
    'Dealbranch' => array(
     'className' => 'Dealbranch', 
     'foreignKey' => 'DLB_DL_ID', 
    ) 
); 
+0

aber es gibt keine direkte Beziehung zwischen Niederlassung und Geschäft –

+0

Es muss eine Relation geben, um 'Deal' beim Löschen von' Branch' zu löschen, andernfalls müssen Sie manuell Code schreiben, um die Geschäftsdatensätze zu löschen –

+0

ok, bedeutet, dass wir nicht rekursiv (Baum) löschen können? –

0

Während ich weiß, die Leute bei CakePHP verwenden keine Fremdschlüssel in ihren Datenbanken und verlassen sich auf die Rahmen Pflege dieser Details zu nehmen, in Ihrem Fall, wenn der Rahmen ist zu geben Sie Probleme und Sie haben die Kontrolle über die Datenbank aktualisieren Ihre Fremdschlüssel Einschränkungen zu CASCADE DELETE DB-Operationen.

0

Das grundlegende Problem ist in Ihrem Datenmodell. Je nach Modell kann jeder Zweig mit null oder mehr Abschlüssen verbunden werden und umgekehrt. Wenn Sie also einen Zweig löschen, macht es keinen Sinn, einen Deal zu löschen, da der Deal mit einem anderen Zweig verknüpft sein könnte. Wenn der Deal gelöscht wurde, wäre die Datenbankintegrität beschädigt.

Die von Ihnen verwendete Einstellung wird häufig zum Modellieren der M: N-Beziehung verwendet.

Das ganze Bild, wenn Ihr Datenmodell:

original model

Und was Sie wirklich gemeint:

new model

Niederlassung Modell

var $hasMany =array(
'Deal' => array(
    'className' => 'Deal', 
    'foreignKey' => <set_according_to_your_column_names>, 
    'dependent' =>true 
    ) 
); 

Deal Modell

var $hasMany = array(
'Branch' => array(
    'className' => 'Dealbranch', 
    'foreignKey' => <set_according_to_your_column_names>, 
) 
); 

Auf diese Weise können Sie im Controller Aufruf nur:

$this->Branch->delete($id,true); 

oder sogar

$this->Branch->delete($id); 

da der zweite Parameter standardmäßig der Fall ist.


Beispiel von M: N Beziehung Person - Adresse. Jeder kann mehr als eine Adresse (z. B. Haus und Arbeit) verwenden und eine Adresse kann von mehreren Personen (Familie, Kollegen) geteilt werden.