比方说,我有一个业务规则,一篇文章有许多评论,一个评论只能被删除,只要它不是最后一个,除了当我删除文章,那么所有的评论都应该被删除。
目前,我在buildRules中的CommentsTable类中有以下代码:
$rules->addDelete(fn($entity, $options) => $this->findByArticleId($entity->article_id)->count() > 1);
当我试图删除一篇文章时,我却在CORE/src/Database/Connection.php:562中得到了一个NestedTransactionRollbackException
。
我如何在规则中检测到文章即将被删除,从而删除所有评论,甚至最后一条评论,是可以的?
我使用带有a soft delete behavior的CakePHP 4.1,这要求我在关联中使用'cascadeCallbacks' => true
,如果这会改变什么的话。
1条答案
按热度按时间fzsnzjdm1#
删除
hasMany
关联的工作方式是先删除子关联再删除父关联,而业务规则流程实际上并不了解外部世界,它无法真正判断某个内容是在什么上下文中被删除的。最多它可以检查该操作是否是级联关联操作的一部分。
_primary
选项,如果为true
,则表示规则所属模型上的显式操作,因此假设为$commentsTable->delete($entity)
而不是级联$articlesTable->delete($entity)
,在这种情况下,_primary
选项将为false
。如果这些信息对你来说足够好,那就去做吧。
如果您需要有关操作发起者的更多信息,那么除了传入可以在规则中评估的自定义选项之外,您实际上没有什么可以做的,例如:
当然,您可以在表本身中实现这一点,例如,通过覆盖
delete()
。