CakePHP:如何确保belongsTo关系中至少有一个条目?

flmtquvp  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(142)

比方说,我有一个业务规则,一篇文章有许多评论,一个评论只能被删除,只要它不是最后一个,除了当我删除文章,那么所有的评论都应该被删除。
目前,我在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,如果这会改变什么的话。

fzsnzjdm

fzsnzjdm1#

删除hasMany关联的工作方式是先删除子关联再删除父关联,而业务规则流程实际上并不了解外部世界,它无法真正判断某个内容是在什么上下文中被删除的。
最多它可以检查该操作是否是级联关联操作的一部分。_primary选项,如果为true,则表示规则所属模型上的显式操作,因此假设为$commentsTable->delete($entity)而不是级联$articlesTable->delete($entity),在这种情况下,_primary选项将为false
如果这些信息对你来说足够好,那就去做吧。

$rules->addDelete(
    function ($entity, $options)  {
        if ($options['_primary'] === false) {
            return true;
        }

        if ($this->findByArticleId($entity->article_id)->count() > 1) {
            return true;
        }

        return false;
    }
);

如果您需要有关操作发起者的更多信息,那么除了传入可以在规则中评估的自定义选项之外,您实际上没有什么可以做的,例如:

$articlesTable->delete($entity, ['_source' => $articlesTable])

当然,您可以在表本身中实现这一点,例如,通过覆盖delete()

相关问题