我对所有模型都附加了doctrine的softdelete行为。有没有办法可以删除特定记录?
在cakephp中,我记得分离行为......删除记录然后重新附加行为。
symfony / doctrine中有类似的东西吗?如果是,那我该如何分离行为?
干杯
答案 0 :(得分:13)
$record->hardDelete();
答案 1 :(得分:10)
想想我会选择Zed的方式,但为了完整性:
用于软删除行为的删除(和选择)的事件侦听器方法包含:
if ( ! $query->contains($field)) {
// do the magic stuff to covert the query to respect softdelete
}
这意味着如果您在查询中明确提及该字段,则不会将转换应用于查询。
所以,如果你这样做:
$q = Doctrine_Query::create()
->delete('Table t')
->where('t.id = ? AND t.deleted != 2 ', 1);
它不会应用软删除内容,实际上会删除记录。请注意,你可以用t.deleted做任何事情,我刚做了一些永远都是真的。别名('t。')对于它起作用也很重要。
这个技巧也适用于选择,这是我之前通常使用它的地方。
正如我所说,我认为做得更好:
$old_dqlc = Doctrine_Manager::getInstance()->getAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS);
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false);
$record->delete();
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, $old_dqlc);
特别是,您仍然可以使用delete()方法,而不必手动创建查询。查询方法的一个优点是,如果您有其他行为附加到记录,它们仍将受到尊重。
答案 2 :(得分:5)
$object->getListener()->setOption('disabled',true);
这将禁用此对象的所有记录侦听器。
答案 3 :(得分:1)
尝试调用它,它应该禁用行为处理。
$manager->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false);
作为一种肮脏的方式,您可以生成一个SQL查询,从表中删除该条目。
答案 4 :(得分:1)
link text我认为这个函数并将dql回调设置为false就像在管理器上一样应该这样做:)。
答案 5 :(得分:1)
想与Joshua Coady达成一致意见,最好的办法是使用
$record->hardDelete()
然而,我还想在这里添加,因为它是google中用于分离学说行为的第一个结果之一,分离“选择”行为的最简单方法就是包含“deleted_at”(或者你拥有的任何内容)在查询中命名您的字段。监听器查看是否包含它,如果是,则不过滤掉已删除的记录。
Doctrine_Core::getTable('Record')->createQuery()->select('id, etc1, etc2')->addSelect('deleted_at')->execute();
将返回已删除的记录。