Yii多表删除不起作用

时间:2013-08-13 07:47:44

标签: php activerecord yii

我有两张桌子:useruserProfile。 我想使用Yii Active Record从两个表中删除记录。

以下是我的代码:

public function actionDelete($id) {
        $this->loadModel($id)->delete();
        $model = $this->loadModel($id);
        User::model()->deleteAll('user_id=:id', array(':id' => $model->user_id));

        // 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'));
    }

以下是两个模型之间的关系:

public function relations() {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'userProfiles' => array(self::HAS_MANY, 'UserProfile', 'user_id'),
        );
    }

public function relations() {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'user' => array(self::BELONGS_TO, 'User', 'user_id'),
        );
    }

首先,我从userProfile表中删除记录(工作正常),然后从该模型中获取user_id并将其传递给deleteAll方法,我试图从{{1}删除记录}表但返回user错误。

这是正确的删除方法吗?或者我哪里错了?

由于

3 个答案:

答案 0 :(得分:1)

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

         $user_id = $model->user_id; // after user profile is deleted, the model still hold old information, but this line just makes sure everything would work correct whether Yii version you was using

        $model->delete();
        User::model()->deleteByPK($user_id); // a user has one or more profile, it doesn't need to use deleteAll()

    // 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')); // error 404 from here you should check about the actual url which this action use to redirect
}

顺便说一句,如果你想绝对删除用户,为什么不让你的db做呢?在MySQL中,你可以更新外键是从RESTRICTEDCASCADE,这意味着一旦你删除了用户记录,它也会自动删除FK的依赖记录(UserProfile),然后你不需要像这样手动处理它。

编辑:随着我从你那里得到的大量信息,可能有些不对劲。我建议你启用日志并查看SQL实现的日志

启用登录protected \ config \ main.php

'components'=>array(
'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error, warning, trace, info',
//                    'categories'=>'application.*',
                    'categories'=>'system.db.CDbCommand',
                ),
                // uncomment the following to show log messages on web pages
                /*array(
                    'class'=>'CWebLogRoute',
                ),*/
            ),
        ),
)

将此行放在您的操作上

Yii::app()->log->processLogs(null);

刷新页面并打开protected\runtime\application.log以查看发生了什么

答案 1 :(得分:1)

在删除记录之后再次尝试获取已删除的模型的信息,以查看发生的情况,以便您收到错误404 the requested page does not exist .

如果你想实现那个,那么你需要在一个单独的变量中取出你要删除的模型的id,并进一步使用该变量来删除另一个记录

答案 2 :(得分:0)

它不是deleteAll方法错误。您可以在此处删除记录$id

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

然后你打电话

$this->loadModel($id);

在loadmodel方法中,您有以下代码:

if($model===null)
        throw new CHttpException(404,'The requested page does not exist.');

你已经删除了它,所以它为null并且你得到了你的错误。

制作loadmodel($id)->delete然后

$model=User::model()->find('id=:id',array(':id'=>$id));
$model->delete();

这将按您的需要运作。