5

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

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

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

4

5 回答 5

4

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

// 这将禁用 SoftDeleteable 过滤器,因此“软删除”的实体将出现在结果中 $em->getFilters()->disable('soft-deleteable');

于 2017-01-29T09:48:49.040 回答
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();
}
于 2011-07-14T10:30:00.537 回答
2

从这里这里的源代码粗略看一下,该行为似乎没有提供此功能SoftDelete。您必须按照where您的建议手动添加一个子句。

(我可能是错的,但我很确定Doctrine_Query不能通过像你可以使用的行为来动态扩展Doctrine_Record。你总是可以编写一个特殊的Doctrine_Query子类来添加includeDeleted(),但这似乎比它的价值更多:))

于 2009-09-01T21:29:56.520 回答
2
$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, false);

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

于 2011-09-12T06:33:16.447 回答
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){}
}
于 2010-08-17T13:25:08.390 回答