代码之家  ›  专栏  ›  技术社区  ›  Florian

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

  •  0
  • Florian  · 技术社区  · 5 年前

    比方说,我有一个商业规则,一篇文章有很多评论,一个评论只能删除,只要它不是最后一个,除了当我删除文章,那么所有的评论也应该删除。

    目前,我在CommentsTable类中的buildRules中有以下代码:

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

    NestedTransactionRollbackException 在CORE/src/数据库中/连接.php:562.

    我如何在规则中检测到文章即将被删除,从而删除所有评论,甚至最后一条,都是可以的?

    我将cakephp4.1与 a soft delete behavior ,这需要我使用 'cascadeCallbacks' => true

    0 回复  |  直到 5 年前
        1
  •  1
  •   ndm    5 年前

    删除 hasMany

    它最多可以检查操作是否是级联关联操作的一部分。这个 _primary 选项,如果 true ,表示该规则所属的模型上的显式操作 $commentsTable->delete($entity) 而不是级联 $articlesTable->delete($entity) ,在这种情况下 _初级 选择是 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()