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

iyzzxitl  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(155)

我在使用CakePHP v3.17 w/ Postgres 9.4
我也尝试让$this->SomeTable->deleteAll([...])删除连接表中的记录。
想象一个公交系统,其中有一个Stops的表和一个Routes的表。站点与许多路线相关联(因为多条公交路线可以在每条路线上停靠),而路线显然与许多站点相关联。
RoutesTable.php:

$this->belongsToMany('Stops');

StopsTable.php:

$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]);

做这件事的更好/正确的方法是什么?
这里是similar question,但用于v2.x,因此不一定与此处相关。

y3bcpkx1

y3bcpkx11#

没有一种方法可以做到你所需要的。但是,我肯定会建议你做你在开场白中已经说过的事情,并把它 Package 成一个事务性的(注意,这是未经测试的,但应该可以工作):

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

相关问题