2016-04-19 42 views
5

Sono su CakePHP v3.17 w/Postgres 9.4CakePHP DeleteAll per molti a molti rapporti non rimuove unirsi record

che sto cercando di ottenere $this->SomeTable->deleteAll([...]) per rimuovere i record nella tabella join troppo.

Immagine di un sistema bus con una tabella per Stops e una tabella per Routes. Le fermate sono associate a molte rotte (poiché le linee di autobus multiple possono fermarsi a ciascuna) e le Rotte ovviamente sono associate a molte fermate.

RoutesTable.php:

$this->belongsToMany('Stops'); 

StopsTable.php:

$this->belongsToMany('Routes'); 

Ecco la logica di eliminazione voglio usare, ma non funziona perché i record nella tabella unirsi sono lasciati :

$stopsTable = TableRegistry::get('Stops'); 
    $stopsTable->deleteAll(['agency_id' => $agency->id]); 

    $routesTable = TableRegistry::get('Routes'); 
    $routesTable->deleteAll(['agency_id' => $agency->id]); 

Ecco la logica che funziona, ma inefficiente perché deve eseguire un ciclo su ogni singolo s top:

$stopsTable = TableRegistry::get('Stops'); 
    foreach ($agency->stops as $stop) { 
     $stopsTable->delete($stop); 
    } 
    $routesTable = TableRegistry::get('Routes'); 
    $routesTable->deleteAll(['agency_id' => $agency->id]); 

Qual è il modo migliore/corretto per farlo?

Ecco uno similar question ma per v2.x quindi non necessariamente rilevante qui.

+1

c'è una prova di unità nel nucleo CakePHP che copre la vostra caso e garantisce che i record della tabella di join vengano cancellati? In caso contrario, segnalalo come problema su Github. Sei sicuro che solo i record della tabella di join vengono lasciati e non anche i record delle tabelle unite? Prova a impostare ''dependent' => true,' per il tuo socio, non sono sicuro che sia di default vero al momento. – burzum

+0

Ciao @burzum L'ho provato con il dipendente => true, e sì, sono sicuro che sono rimasti solo i record della tabella di join perché sto testando su tavoli vuoti ... Quindi dopo il test le fermate e i percorsi sono vuoti ma routes_stops è ancora pieno. Non sono sicuro della domanda del test di unità ... – emersonthis

+0

Potrebbe essere necessario abilitare [eliminazioni a catena] (http://book.cakephp.org/3.0/en/orm/deleting-data.html#cascading-deletes) invece di solo dipendente. –

risposta

1

Non c'è un modo per fare ciò di cui hai bisogno. Ma, certamente suggerisco di fare quello che già detto nel post di apertura e avvolgerlo in un transazionale (notare che questo non è testato, ma dovrebbe funzionare):

$stopsTable->connection()->transactional(function() use ($stopsTable, $stops) { 
    foreach ($stops as $stop) { 
     $stopsTable->delete($stop); 
    } 
}); 
+0

Grazie. Sei sicuro che '-> transazionale()' è necessario? Ho visto [nei documenti] (http://book.cakephp.org/3.0/en/orm/deleting-data.html#namespace-Cake\ORM) che "tutte le eliminazioni avvengono all'interno di una transazione" ma non ero sicuro cosa significava. – emersonthis

+0

I documenti indicano che l'oggetto principale che viene eliminato e le sue associazioni dipendenti vengono tutti cancellati in una transazione. – chrisShick