6

我的所有模型都附加了学说的软删除行为。有没有办法可以硬删除特定记录?

在 cakephp 我记得分离行为......删除记录然后重新附加行为。

symfony/doctrine 中是否有类似的东西?如果是这样,那么我如何分离行为?

干杯

4

6 回答 6

13

嗯 .. SoftDelete 行为包括一种更好的方法...只需调用

$record->hardDelete();
于 2010-02-19T23:45:38.337 回答
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() 方法,而不必手动创建查询。查询方法的一个优点是,如果您在记录中附加了其他行为,它们仍然会受到尊重。

于 2010-02-01T20:09:10.023 回答
5

$object->getListener()->setOption('disabled',true);

这将禁用该对象的所有记录侦听器。

于 2011-02-23T13:22:11.133 回答
1

尝试调用它,它应该禁用行为处理。

$manager->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false);

作为一种肮脏的方式,您可以生成从表中删除条目的 SQL 查询。

于 2009-09-24T14:23:53.007 回答
1

链接文本我认为这个函数并将使用 dql 回调设置为 false 就像在管理器上一样应该可以解决问题:)。

于 2009-12-07T12:27:17.617 回答
1

想同意 Joshua Coady 的观点,最好的方法是使用

$record->hardDelete()

但是,我也想在这里添加,因为它是谷歌上分离行为的第一个结果,即分离“选择”行为的最简单方法是简单地包含“deleted_at”(或任何你命名的字段)就像在查询中一样。侦听器查看它是否包含在内,如果包含,则不过滤已删除的记录。

Doctrine_Core::getTable('Record')->createQuery()->select('id, etc1, etc2')->addSelect('deleted_at')->execute();

将返回已删除的记录。

于 2010-08-12T21:44:58.207 回答