我有关于所有模型的原则的softdelete行为。有没有办法我可以很难删除一个特定的记录?如何分离Symfony/Doctrine中的行为?
在cakephp我记得分离的行为...删除记录,然后重新附加行为。
symfony/doctrine中有类似的东西吗?如果是这样,那么我如何分离一个行为?
干杯
我有关于所有模型的原则的softdelete行为。有没有办法我可以很难删除一个特定的记录?如何分离Symfony/Doctrine中的行为?
在cakephp我记得分离的行为...删除记录,然后重新附加行为。
symfony/doctrine中有类似的东西吗?如果是这样,那么我如何分离一个行为?
干杯
想我会去的捷思锐的方式,但对于完整性:
的事件监听方法删除(选择)的软删除行为包括:
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()方法,而不必手动创建查询。查询方法的一个优点是,如果您有其他行为附加到记录,他们仍然会受到尊重。
link text我会认为这个函数和设置使用dql回调为false就像在经理应该做的伎俩:)。
嗯..的SoftDelete behavior包括这样做的好得多的办法......就叫
$record->hardDelete();
是的 - 推荐在我的想法之前接受它。我从此开始使用它。 – benlumley 2010-08-14 16:57:07
想与约书亚科迪同意,最好的方式是使用
$record->hardDelete()
然而,我也想在这里添加它,因为它是谷歌的第一个结果之一,用于分离在学说中的行为,将“选择”行为分离的最简单方法就是简单地包含“deleted_at”(或任何您已命名的字段就像在查询中一样。监听者看起来像是一样e是否包含它,如果是,则不过滤删除的记录。
Doctrine_Core::getTable('Record')->createQuery()->select('id, etc1, etc2')->addSelect('deleted_at')->execute();
将返回删除的记录。
$object->getListener()->setOption('disabled',true);
这将禁用所有记录监听器此对象。
您可能应该存储Doctrine :: ATTR_USE_DQL_CALLBACKS的前一个值,而不是设置为false和true。如果在遇到代码之前CALLBACKS已关闭,该怎么办? – 2010-08-14 02:20:06
是的...我应该...编辑。 – benlumley 2010-08-14 16:55:32
(尽管如果回调关闭,软删除不起作用) – benlumley 2010-08-14 16:57:46