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

CakePHP deleteAll for many to many relationship does not remove join records

我正在使用带有 Postgres 9.4 的 CakePHP v3.17

我也在尝试让 $this->SomeTable->deleteAll([...]) 删除连接 table 中的记录。

用 table 代表 Stops 和 table 代表 Routes 来想象一个总线系统。站点与许多路线相关联(因为多条公交路线可以在每个站点停靠)并且路线显然与许多站点相关联。

RoutesTable.php:

$this->belongsToMany('Stops');

StopsTable.php:

$this->belongsToMany('Routes');

这是我想使用的删除逻辑,但不起作用,因为连接 table 中的记录被遗留下来:

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

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

这是确实有效的逻辑,但效率低下,因为它必须遍历每一站:

    $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 所以这里不一定相关。

没有办法满足您的需求。但是,我当然会建议按照您在开场白 post 中所说的进行操作,并将其包装在事务中(注意这是未经测试的,但应该可以工作):

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