3

我有列 id、name 和 parentid 的表

模型中的关系函数:

 '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也需要删除。

4

2 回答 2

7

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

public function beforeDelete(){
    foreach($this->location_children as $c)
        $c->delete();
    return parent::beforeDelete();
}

确保将初始删除调用包装在事务中,以确保删除所有记录或不删除任何记录。

您也可以只使用CDbCommand来执行删除。

于 2013-06-22T09:30:44.493 回答
0
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 . "'");
于 2014-05-08T08:19:23.103 回答