3

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

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

例如,

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

$book->getAuthor();

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

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

4

3 回答 3

1

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

于 2014-01-15T10:34:49.297 回答
0

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

$c = new Criteria();
$c->getNewCriterion(self::AUTHOR_ID, $parentId);
return self::doSelect($c, $connection);
于 2010-11-08T22:14:04.783 回答
0

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

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

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

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

于 2013-12-23T13:54:29.493 回答