5

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

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

Stops用一张表和一张表对总线系统进行成像Routes。停靠点与许多路线相关联(因为多条公交路线可以在每条路线停靠)并且路线显然与许多停靠点相关联。

路由表.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,因此在这里不一定相关。

4

1 回答 1

1

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

$stopsTable->connection()->transactional(function () use ($stopsTable, $stops) {
    foreach ($stops as $stop) {
        $stopsTable->delete($stop);
    }
});
于 2016-04-20T23:23:48.343 回答