2009-09-24 86 views
6

我有关于所有模型的原则的softdelete行为。有没有办法我可以很难删除一个特定的记录?如何分离Symfony/Doctrine中的行为?

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

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

干杯

回答

9

想我会去的捷思锐的方式,但对于完整性:

的事件监听方法删除(选择)的软删除行为包括:

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()方法,而不必手动创建查询。查询方法的一个优点是,如果您有其他行为附加到记录,他们仍然会受到尊重。

+1

您可能应该存储Doctrine :: ATTR_USE_DQL_CALLBACKS的前一个值,而不是设置为false和true。如果在遇到代码之前CALLBACKS已关闭,该怎么办? – 2010-08-14 02:20:06

+0

是的...我应该...编辑。 – benlumley 2010-08-14 16:55:32

+0

(尽管如果回调关闭,软删除不起作用) – benlumley 2010-08-14 16:57:46

1

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

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

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

+0

nah ..我认为这是肮脏的.. ..但无论如何..谢谢.. – Yashvit 2009-09-24 14:28:48

+0

行。试试我添加的电话。还没有尝试过,但我想它应该工作。 – Zed 2009-09-24 14:31:16

+0

很酷..会给那个去... – Yashvit 2009-09-24 15:01:40

1

link text我会认为这个函数和设置使用dql回调为false就像在经理应该做的伎俩:)。

13

嗯..的SoftDelete behavior包括这样做的好得多的办法......就叫

$record->hardDelete(); 
+0

是的 - 推荐在我的想法之前接受它。我从此开始使用它。 – benlumley 2010-08-14 16:57:07

1

想与约书亚科迪同意,最好的方式是使用

$record->hardDelete() 

然而,我也想在这里添加它,因为它是谷歌的第一个结果之一,用于分离在学说中的行为,将“选择”行为分离的最简单方法就是简单地包含“deleted_at”(或任何您已命名的字段就像在查询中一样。监听者看起来像是一样e是否包含它,如果是,则不过滤删除的记录。

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

将返回删除的记录。

5

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

这将禁用所有记录监听器此对象。