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

eme*_*his 5 php postgresql cakephp cakephp-3.0

我在CakePHP v3.17 w/Postgres 9.4上

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

对带有桌子Stops和桌子的总线系统进行成像Routes.停靠与许多路线相关联(因为多条公交线路可以在每条路线停靠),而且路线显然与许多站点相关联.

RoutesTable.php:

$this->belongsToMany('Stops');
Run Code Online (Sandbox Code Playgroud)

StopsTable.php:

$this->belongsToMany('Routes');
Run Code Online (Sandbox Code Playgroud)

这是我想要使用的删除逻辑,但由于连接表中的记录遗留下来,因此无效:

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

    $routesTable = TableRegistry::get('Routes');
    $routesTable->deleteAll(['agency_id' => $agency->id]);
Run Code Online (Sandbox Code Playgroud)

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

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

有什么更好/更正的方法呢?

这是一个类似的问题,但对于v2.x,所以这里不一定相关.

chr*_*ick 1

没有办法做你需要的事情。但是,我当然建议按照您在开篇文章中所说的进行操作,并将其包装在事务中(请注意,这是未经测试的,但应该可行):

$stopsTable->connection()->transactional(function () use ($stopsTable, $stops) {
    foreach ($stops as $stop) {
        $stopsTable->delete($stop);
    }
});
Run Code Online (Sandbox Code Playgroud)