我有一个艺匠命令,用于清理一些已经出错的数据。在实际删除数据之前,我想要先进行模拟运行,并展示删除这些数据可能带来的影响。
我的命令的核心是:
public function handle()
{
...
$this->dryRun($modelsToDelete); // Prints info to user
if ($this->confirm('Are you sure you want to delete?') {
$modelsToDelete->each->forceDelete();
}
...
}
public function dryRun($modelsToDelete)
{
...
DB::connection($connection)->beginTransaction();
$before = $this->findAllOrphans($models);
$modelsToDelete->each(function ($record) use ($bar) {
$record->forceDelete();
});
$after = $this->findAllOrphans($models);
DB::connection($connection)->rollBack();
// Print info about diff
...
}
问题在于,当我进行试运行并确认删除时,实际操作没有在数据库中持久化。如果我注释掉试运行并执行该命令,则操作会持久化。我已经检查了试运行和实际操作之前和之后的
DB::transactionLevel()
,一切似乎都正确。我还尝试使用
DB::connection($connection)->pretend(...)
,但问题仍然存在。我也尝试在回滚后执行 DB::purge($connection)
和 DB::reconnect($connection)
。有人有什么想法吗?
(使用Laravel
v6.20.14
)