作为 Mutable Labs 的开发负责人,我接到了一个任务:找到一个在yii中递归删除的方法。当我问其他的开发者,环顾互联网,答案通常是使用插件或在数据库级别使用级联删除,但我不想通过这两种方式来做。
所以我自己想出了一个解决办法,并且它非常简单而有效。在你的通用模型中添加一个方法,如果没用通用模型就创建一个。创建一个模型继承 CActiveRecord,确保你的其他所有模型继承此模型。这里放在你应用中任何模型都会用到的方法。
将下面的方法放到通用模型中
public function deleteRecursive($relations = array()) { foreach($relations as $relation) { if(is_array($this->$relation)) { foreach($this->$relation as $relation_item) { $relation_item->deleteRecursive(); } } else { $this->$relation->deleteRecursive(); } } $this->delete(); }
现在设置其他模型确保他们可以使用添加的方法来递归删除。确保你替换了 'tags' and 'comments' 为你想要删除的关系,这些关系必须在 active record 的relations设置。如上所述,如果你正确添加了 ‘子模型’(tags,comments),当你运行递归删除的时候将会删除他们所有的子模型。
public function deleteRecursive() { parent::deleteRecursive(array("tags", "comments")); }
如果你遇到没有子关系的模型,它也会删除这个没有子关系的模型,因为deleteRecursive()定义在父类中。即使模型没有子关系它也会调用此方法,不过只是删除这个模型而已。
这个方法应该可以在你的应用上处理递归删除,快去试试吧。