我如何分离Symfony / Doctrine中的行为?

时间:2009-09-24 14:15:40

标签: php symfony1 doctrine

我对所有模型都附加了doctrine的softdelete行为。有没有办法可以删除特定记录?

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

symfony / doctrine中有类似的东西吗?如果是,那我该如何分离行为?

干杯

6 个答案:

答案 0 :(得分:13)

嗯.. SoftDelete behavior包含了一个更好的方法......只需打电话

$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();

将返回已删除的记录。