【问题标题】:Does Propel know when an object has been soft-deleted, so that child entities could still show their deleted parent?Propel 是否知道对象何时被软删除,以便子实体仍然可以显示其已删除的父对象?
【发布时间】:2014-01-15 18:34:49
【问题描述】:

我正在软删除 MySQL 数据库中的对象并使用 Propel ORM。我已经开始进行软删除,但代价是失去了强制的父子关系,因为实际的行没有被删除。

有什么方法可以让 Propel 在你访问一条记录的时候知道它已经被软删除,从而不抛出空引用异常?这样,虽然父级已被删除,其子级仍可读取其关系,但当更新子级或创建新子级时,已删除的父级不可访问。

例如,

图书有一个AuthorId,如果属于AuthorId的作者被软删除,那么:

$book->getAuthor();

将返回正确的作者(仅供查看)。但是,如果添加了新书,则无法选择被软删除的作者。

有人知道这个功能是否内置在 Propel 中吗?

【问题讨论】:

    标签: php propel soft-delete


    【解决方案1】:

    软删除是一个破碎的抽象。您应该改用可归档行为(请参阅 Propel 博客中的原因:http://propelorm.org/blog/2011/08/29/introducing-archivable-behavior-and-why-soft-delete-is-deprecated.html

    【讨论】:

      【解决方案2】:

      我不确定为什么允许删除作者,但不允许删除他的作品(或者,基本上,为什么这会在您的项目中出现),但您可以创建自定义标准并执行它。以下代码取决于您使用的 Propel 版本(但概念保持不变):

      $c = new Criteria();
      $c->getNewCriterion(self::AUTHOR_ID, $parentId);
      return self::doSelect($c, $connection);
      

      【讨论】:

        【解决方案3】:

        偶然发现了这个问题。似乎不对您描述的功能使用软删除更有意义。我强烈建议您创建一个字段来标记作者是否已启用,即一个名为 isEnabled 的布尔字段。

        然后您可以将生成的过滤器方法用于 AuthorQuery 类,在这种情况下

        AuthorQuery::create->filterByisEnabled()
                           ->find();
        

        如果一个对象仍将在应用程序中使用,那么删除它是不合适的。软删除功能仅供参考或还原错误。

        【讨论】:

          猜你喜欢
          • 2013-07-16
          • 2021-11-11
          • 2011-03-25
          • 1970-01-01
          • 2019-11-25
          • 2021-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多