我在MySQL数据库中使用Propel ORM软删除对象。我已经软删除工作,但代价是失去强制父子关系,因为实际的行没有被删除。
Propel是否有办法知道在访问记录时已经软删除了记录,因此不会抛出空引用异常?这样,虽然已删除父级,但其子级仍然可以读取它的关系,但是当更新一个孩子,或者创建一个新孩子时,删除的父母不可访问。
例如,
Book有一个AuthorId,如果属于AuthorId的作者被软删除,那么:
$book->getAuthor();
会返回正确的作者(仅供查看)。但是,如果添加了新书,则无法选择软删除的作者。
有人知道Propel中是否内置了该功能吗?
答案 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();
如果仍然要在应用程序中使用某个对象,则删除它并不合适。软删除功能仅供参考或还原错误。