如果我的某个PHP Doctrine对象充当SoftDelete,是否可以在某些查询的结果中包含已删除的项?我正在寻找的是这样的......
$q = Doctrine_Query::create()
->select('*')
->from('Test t')
->where('id < ?', 25)
*->includeDeleted()*;
这样的内容对于大多数查询都很有用,我希望删除已删除的记录,但有时(例如,管理员)我希望能够包含已被软删除的记录。有没有一些很好的方法可以使用SoftDelete执行此操作,还是应该在大多数查询中添加一个额外的where子句?
答案 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)
通过粗略浏览源here和here,SoftDelete
行为似乎无法提供此功能。您必须像您建议的那样手动添加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关闭等数据。