CakePHP deleteAll对于多对多关系不会删除连接记录

时间:2016-04-19 17:15:11

标签: php postgresql cakephp cakephp-3.0

我在CakePHP v3.17 w / Postgres 9.4

我试图让$this->SomeTable->deleteAll([...])删除联接表中的记录。

使用Stops表和Routes表格对总线系统进行映像。停靠与许多路线相关联(因为多条路线可以在每条路线停靠),路线显然与许多路段相关联。

RoutesTable.php:

$this->belongsToMany('Stops');

StopsTable.php:

$this->belongsToMany('Routes');

这是我想要使用的删除逻辑,但DOESN' T工作,因为连接表中的记录遗留下来:

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

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

以下是DOES工作的逻辑,但效率低下,因为它必须遍历每一站:

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

这样做的更好/更正的方法是什么?

这里是similar question但是对于v2.x,所以这里不一定相关。

1 个答案:

答案 0 :(得分:1)

没有办法做你需要的事。但是,我肯定会建议你在你的开场白中做你已经说过的事情并将其包装成交易(注意这是未经测试的,但应该有效):

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