多对多关系的 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);
}
});
我正在使用带有 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);
}
});