我的所有模型都附加了学说的软删除行为。有没有办法可以硬删除特定记录?
在 cakephp 我记得分离行为......删除记录然后重新附加行为。
symfony/doctrine 中是否有类似的东西?如果是这样,那么我如何分离行为?
干杯
嗯 .. SoftDelete 行为包括一种更好的方法...只需调用
$record->hardDelete();
认为我会采用 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() 方法,而不必手动创建查询。查询方法的一个优点是,如果您在记录中附加了其他行为,它们仍然会受到尊重。
$object->getListener()->setOption('disabled',true);
这将禁用该对象的所有记录侦听器。
尝试调用它,它应该禁用行为处理。
$manager->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false);
作为一种肮脏的方式,您可以生成从表中删除条目的 SQL 查询。
链接文本我认为这个函数并将使用 dql 回调设置为 false 就像在管理器上一样应该可以解决问题:)。
想同意 Joshua Coady 的观点,最好的方法是使用
$record->hardDelete()
但是,我也想在这里添加,因为它是谷歌上分离行为的第一个结果,即分离“选择”行为的最简单方法是简单地包含“deleted_at”(或任何你命名的字段)就像在查询中一样。侦听器查看它是否包含在内,如果包含,则不过滤已删除的记录。
Doctrine_Core::getTable('Record')->createQuery()->select('id, etc1, etc2')->addSelect('deleted_at')->execute();
将返回已删除的记录。