PHP Doctrine SoftDelete - 包含已删除的记录?

时间:2009-09-01 19:14:31

标签: php doctrine soft-delete

如果我的某个PHP Doctrine对象充当SoftDelete,是否可以在某些查询的结果中包含已删除的项?我正在寻找的是这样的......

$q = Doctrine_Query::create()
    ->select('*')
    ->from('Test t')
    ->where('id < ?', 25)
    *->includeDeleted()*;

这样的内容对于大多数查询都很有用,我希望删除已删除的记录,但有时(例如,管理员)我希望能够包含已被软删除的记录。有没有一些很好的方法可以使用SoftDelete执行此操作,还是应该在大多数查询中添加一个额外的where子句?

5 个答案:

答案 0 :(得分:3)

它返回表中的所有记录(包括softDeleted)

public function findAllWithDeleted()
{
    $query = $this->createQuery('a');
    $query->addWhere('(a.deleted_at IS NULL OR a.deleted_at IS NOT NULL)');
    return $query->execute();
}

答案 1 :(得分:2)

通过粗略浏览源herehereSoftDelete行为似乎无法提供此功能。您必须像您建议的那样手动添加where子句。

(我可能错了,但我很确定Doctrine_Query无法通过Doctrine_Record之类的行为动态扩展。你可以写一个特殊的Doctrine_Query子类,增加includeDeleted(),但这似乎比它的价值更加强大:))

答案 2 :(得分:2)

看起来你可以禁用软删除过滤器 http://atlantic18.github.io/DoctrineExtensions/doc/softdeleteable.html

//这将禁用SoftDeleteable过滤器,因此“软删除”的实体将出现在结果中 $ EM-&GT; getFilters() - &GT;禁用( '软可删除');

答案 3 :(得分:1)

我们在Doctrine 1.2.2中遇到了一个错误,其中忽略了ATTR_USE_DQL_CALLBACKS并且softdelete列的名称错误。解决方案是覆盖监听器:

$m = new MyModel;
$m->setListener(new MockListener());
$m->getTable()->getQueryObject(); //... and so forth

使用虚拟课程:

class MockListener implements Doctrine_Overloadable
{
    public function __call($m, $a){}
}

答案 4 :(得分:1)

$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, false);

在此之后,您可以选择,更新,删除softDelete关闭等数据。