Yii 级联删除表的子记录

Yii 级联删除表的子记录,yii,Yii,我有列id、名称和父id的表 模型中的关系函数: 'location_parent' => array(self::BELONGS_TO, 'Location', 'parentid'), 'location_children' => array(self::HAS_MANY, 'Location', 'parentid', 'order' => 'id ASC'), 删除控制器中的操作: public function actionDelete($id) {

我有列id、名称和父id的表

模型中的关系函数:

 'location_parent' => array(self::BELONGS_TO, 'Location', 'parentid'),
 'location_children' => array(self::HAS_MANY, 'Location', 'parentid', 'order' => 'id ASC'),
删除控制器中的操作:

public function actionDelete($id)
    {
            $this->loadModel($id)->delete();

            // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
            if(!isset($_GET['ajax']))
                    $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }
要求:


在这里,如果我删除id=1的记录,那么也需要删除parentid=1的行

在您的模型中,重写
beforeDelete
方法,在删除父记录之前递归删除所有子记录,即

public function beforeDelete(){
    foreach($this->location_children as $c)
        $c->delete();
    return parent::beforeDelete();
}
确保在事务中包装初始删除调用,以确保删除所有记录或不删除任何记录

您也可以使用
CDbCommand
执行删除操作

public function actionDelete($id)
    {
              //delete location _children 

 foreach( $this->loadModel($id)->location_children as $c)
         $c->delete();

              //delete location_parent

 foreach( $this->loadModel($id)->location_parent as $c)
         $c->delete();

            $this->loadModel($id)->delete();

            // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
            if(!isset($_GET['ajax']))
                    $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }
或者您也可以使用
deleteall()
删除特定id的所有记录

AssociatedModel::model()->deleteAll("parent_id ='" . $id . "'");

我会在
afterDelete()中完成它。
!原因是,由于某种原因,delete命令可能会在数据库中失败。在这种情况下,您可能不想删除相关的子记录。而
afterDelete()
仅在删除成功时执行。如果在afterDelete中执行此操作,您的数据库可能会抱怨,因为您将删除包含外键记录的记录。