CakePHP:如何确保 belongsTo 关系中始终至少有一项?

CakePHP: How to ensure there's always at least one item in a belongsTo relationship?

比方说,我有一个业务规则,一篇文章有​​很多评论,只有不是最后一个评论才能被删除,除非我删除文章,那么所有评论也应该被删除.

目前我在 CommentsTable class buildRules 中有这段代码:

$rules->addDelete(fn($entity, $options) => $this->findByArticleId($entity->article_id)->count() > 1);

当我尝试删除一篇文章时,我却在 CORE/src/Database/Connection 中得到一个 NestedTransactionRollbackException。php:562.

如何在规则中检测到文章即将被删除,从而删除所有评论,包括最后一条评论,是否可以?

我将 CakePHP 4.1 与 a soft delete behavior 一起使用,这要求我在关联中使用 'cascadeCallbacks' => true,如果这有任何变化的话。

删除 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])

您当然可以在 table 本身中实现它,例如通过覆盖 delete().