PHP软件删除-是否包括已删除的记录?

PHP软件删除-是否包括已删除的记录?,php,doctrine,soft-delete,Php,Doctrine,Soft Delete,如果我有一个PHP Doctrine对象充当SoftDelete,是否可以在某些查询的结果中包含已删除的项?我要找的是这样的东西 $q = Doctrine_Query::create() ->select('*') ->from('Test t') ->where('id < ?', 25) *->includeDeleted()*; $q=Doctrine\u Query::create() ->选择(“*”) ->from('

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

$q = Doctrine_Query::create()
    ->select('*')
    ->from('Test t')
    ->where('id < ?', 25)
    *->includeDeleted()*;
$q=Doctrine\u Query::create()
->选择(“*”)
->from('Test t')
->其中('id<?',25)
*->includeDeleted()*;

对于我希望排除已删除记录的大多数查询来说,这样做很有用,但有时(例如,对于管理员),我希望能够包括已软删除的记录。使用SoftDelete有什么好方法可以做到这一点,还是我应该简单地在大多数查询中添加一个额外的where子句?

粗略地看一下源代码,这个功能似乎不是由
SoftDelete
行为提供的。您必须按照建议手动添加
where
子句


(我可能错了,但我很确定,
doctor\u Query
不能像您使用
doctor\u Record
那样动态扩展。您可以随时编写一个特殊的
doctor\u Query
子类,添加
includeDeleted()
,但这似乎比它的价值更大:))

我们在原则1.2.2中有一个错误,ATTR_USE_DQL_回调被忽略,softdelete列的名称错误。解决方案是覆盖侦听器:

$m = new MyModel;
$m->setListener(new MockListener());
$m->getTable()->getQueryObject(); //... and so forth
使用虚拟类:

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

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


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

看起来您可以禁用soft deleteable filter

//这将禁用SoftDeleteable筛选器,因此“软删除”的实体将显示在结果中 $em->getFilters()->disable('soft-deletable')

public function findAllWithDeleted()
{
    $query = $this->createQuery('a');
    $query->addWhere('(a.deleted_at IS NULL OR a.deleted_at IS NOT NULL)');
    return $query->execute();
}
$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, false);