Laravel - 在提交许多其他事务后回滚特定的雄辩事务

问题描述 投票:0回答:1

我会尽力解释我的问题,

假设我有一个许多管理员使用的运输系统, 运输步骤之一是将选定的包裹放入容器中,

问题:一位管理员在其中一个容器中添加了错误的包。 (此操作影响数据库中的多个表),因此此操作涉及多个模型(例如:发票模型、容器模型、包装模型)。

他继续执行下一个任务,许多交易已提交到数据库(使用 eloquent) 之后另一位管理员发现了问题,

问题:有没有办法记录每一步事务(所有涉及的模型),以便我们可以在需要时回滚?

php laravel database eloquent rollback
1个回答
0
投票

即使您已经记录了事务所做的所有更改,您也不能在事务提交后回滚事务。原因是可能会有进一步的更改影响相同的记录,因此现在存在版本冲突。创建或修改的某些记录可能不再有效。

相反,正如其他人指出的那样,您需要在应用程序级别上实现这一点。假设您有一个 Command 对象(有些可能将其命名为 Action 或只是一个服务),它封装了将包添加到容器的所有操作。我们称之为

AddPackage
,它在不同模型中进行所有更改。现在您需要实现
RemovePackage
它将执行相反的操作。

现在出于实际原因,您可能需要在执行 AddPackage 之前知道给定模型中给定字段的值是多少。这意味着您需要保留记录的版本。在 Rails 世界中,这是通过

paper_trail
实现的,我不太喜欢 Laravel,但快速搜索发现了
spatie/laravel-activitylog

© www.soinside.com 2019 - 2024. All rights reserved.