我有两张桌子:user
和userProfile
。
我想使用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
错误。
这是正确的删除方法吗?或者我哪里错了?
由于
答案 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中,你可以更新外键是从RESTRICTED
到CASCADE
,这意味着一旦你删除了用户记录,它也会自动删除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();
这将按您的需要运作。