CakePHP deleteAll for many-to-many relationship不会删除联接记录


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

我使用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]);

做这件事的更好/正确的方法是什么?

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

没有办法满足您的需求。但是,我当然建议做你在开场白中已经说过的事情,并将其封装在事务中(注意,这是未经测试的,但应该有效):

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