Propel 是否知道对象何时被软删除,以便子实体仍然可以显示其已删除的父实体?
-
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();
如果一个对象仍将在应用程序中使用,那么删除它并不合适。软删除功能仅用于参考或恢复错误。
不隶属于 StackOverflow