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

时间:2010-03-25 20:55:24

标签: php propel soft-delete

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

Propel是否有办法知道在访问记录时已经软删除了记录,因此不会抛出空引用异常?这样,虽然已删除父级,但其子级仍然可以读取它的关系,但是当更新一个孩子,或者创建一个新孩子时,删除的父母不可访问。

例如,

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

$book->getAuthor();

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

如果仍然要在应用程序中使用某个对象,则删除它并不合适。软删除功能仅供参考或还原错误。