Propel 是否知道对象何时被软删除,以便子实体仍然可以显示其已删除的父实体?

StackOverflow https://stackoverflow.com/questions/2519297

  •  22-09-2019
  •  | 
  •  

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

有没有办法让 Propel 在访问记录时知道该记录已被软删除,从而不会抛出空引用异常?这样,虽然父项已被删除,但其子项仍然可以 这是关系,但是当 更新中 一个孩子,或者 创造 对于新的子级,已删除的父级不可访问。

例如,

Book有一个AuthorId,如果属于AuthorId的作者被软删除,则:

$book->getAuthor();

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

有人知道 Propel 中是否内置了该功能吗?

有帮助吗?

解决方案

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

其他提示

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

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

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

然后,您可以使用为 AuthorQuery 类生成的过滤器方法,在本例中

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

如果一个对象仍将在应用程序中使用,那么删除它并不合适。软删除功能仅用于参考或恢复错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top