CakePHP deleteAll for many-to-many关系不会删除连接记录

CakePHP deleteAll for many-to-many关系不会删除连接记录,php,postgresql,cakephp,cakephp-3.x,cakephp-3.1,Php,Postgresql,Cakephp,Cakephp 3.x,Cakephp 3.1,我使用的是CakePHP v3.17 w/Postgres 9.4 我正在尝试获取$this->SomeTable->deleteAll([…])以删除联接表中的记录 使用站点表和路线表对公交系统进行成像。站点与许多路线相关联(因为多条公交路线可以在每条路线上停靠),而路线显然与许多站点相关联 RoutesTable.php: $this->belongsToMany('Stops'); $this->belongsToMany('Routes'); StopsTable.php

我使用的是CakePHP v3.17 w/Postgres 9.4

我正在尝试获取
$this->SomeTable->deleteAll([…])
以删除联接表中的记录

使用
站点表
路线表
对公交系统进行成像。站点与许多路线相关联(因为多条公交路线可以在每条路线上停靠),而路线显然与许多站点相关联

RoutesTable.php:

$this->belongsToMany('Stops');
$this->belongsToMany('Routes');
StopsTable.php:

$this->belongsToMany('Stops');
$this->belongsToMany('Routes');
以下是我想要使用的删除逻辑,但由于联接表中的记录被保留,因此无法使用:

    $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]);
这样做的更好/正确的方法是什么


这里有一个用于v2.x的but,因此在这里不一定相关。

没有一种方法可以满足您的需要。但是,我当然会建议你按照你在开场白中所说的去做,并将其包装成一个事务性的(注意,这是未经测试的,但应该有效):


CakePHP内核中是否有一个单元测试覆盖您的案例并确保删除联接表记录?如果没有,请在Github上报告它作为一个问题。您确定只剩下联接表记录,而不剩下联接表记录吗?请尝试为您的assoc设置
'dependent'=>true,
,我现在不确定它是否默认为true。您好@burzum我已经用dependent=>true尝试过了,是的,我确定只有联接表记录被保留下来,因为我正在空表上测试。。。因此,在测试之后,站点和路线是空的,但是站点仍然是满的。我不确定单元测试问题…您可能需要启用而不是依赖。我认为批量删除不能与级联删除一起工作,因为事件前后不会应用于批量删除。文档上说你需要加载记录并分别删除它们。@克里斯希克,你能分享一个链接到文档所说的地方吗?谢谢。您确信
->transactional()
是必需的吗?我看到“所有删除都发生在一个事务中”,但我不确定这意味着什么。文档的意思是要删除的主要对象及其依赖关联在一个事务中都被删除。