/** * 删除信息 * 多表删除 事物处理 * 删除 question 中信息 * 删除 answer 表中信息 * 删除 question * 更新topic中次数 */ public function actionDelete($id) { $transaction = Yii::app()->db->beginTransaction(); try { //删除question 表信息 if (!Question::model()->deleteByPk($id)) { throw new Exception("删除question表失败"); } //删除 topic_question 表 首先把 topic id 查找出来 //获取topic id $topic_ids = TopicQuestion::model()->findAll(array('select' => 'topic_id', 'condition' => 'question_id=:question_id', 'params' => array(':question_id' => $id))); //更新 topic次数 foreach ($topic_ids as $model) { //更新topic 次数 if (!Topic::model()->updateByPk($model->topic_id, array('discuss_count' => new CDbExpression('discuss_count-1')))) { throw new ErrorException('更新失败'); } } //删除topic_question 表中信息 if (false === TopicQuestion::model()->deleteAll('question_id=:question_id', array('question_id' => $id))) { throw new ErrorException('删除topic_question中信息失败'); } //删除question_comment 中信息 if (false === QuestionComments::model()->deleteAll('question_id=:question_id', array('question_id' => $id))) { throw new ErrorException('删除question_comment中信息失败'); } //获取answer_comment 中id $answer_comment_models = Answer::model()->findAll(array('select' => 'id', 'condition' => 'question_id=:question_id', 'params' => array(':question_id' => $id))); //删除answer_comment 中信息 foreach ($answer_comment_models as $answer_comment_model) { if (false === AnswerComments::model()->deleteAll('answer_id=:answer_id', array(':answer_id' => $answer_comment_model->id))) { throw new ErrorException('删除answer_comment中信息失败'); } } //删除answer 表中信息 if (false === Answer::model()->deleteAll('question_id=:question_id', array('question_id' => $id))) { throw new ErrorException('删除answer中信息失败'); } //删除question_focus 中信息 if (false === QuestionFocus::model()->deleteAll('question_id=:question_id', array('question_id' => $id))) { throw new ErrorException('删除question_focus 中信息失败'); } $transaction->commit(); $this->success('删除成功'); } catch (Exception $e) { $transaction->rollBack(); exit($e->getMessage()); $this->error($e->getMessage()); } }
/** * * 处理更新 */ public function actionCheckUpdate() { if (!Yii::app()->request->isPostRequest) { $this->error('一定是你的打开方式不对!'); } //var_dump($_POST); $id = $_POST['id']; if (!$this->checkUpdateAuth($id)) { $this->error('没有权限修改!'); } //启用事物处理 $transaction = Yii::app()->db->beginTransaction(); try { //更新question 表相关信息 $data = array(); $data['question_content'] = htmlspecialchars($_POST['title']); $data['question_detail'] = htmlspecialchars($_POST['detail']); if (false === Question::model()->updateByPk($id, $data)) { $this->error('更新失败'); } //话题更新 如果存在则返回 topic_id 不存在则插入病返回topic_id $topics = array_unique($_POST['topic']); if ($topics) { $criteria = new CDbCriteria(); $criteria->condition = "topic_title=:topic_title"; $criteria->select = 'id,discuss_count'; //循环比较插入 foreach ($topics as $topic) { $criteria->params = array(':topic_title' => $topic); $topic_id_model = Topic::model()->find($criteria); if (!$topic_id_model) { //未在数据库中找到则插入并返回id $topic_id = $this->insertTopic($topic); if (!$topic_id) { //插入失败 throw new ErrorException("话题添加失败1"); } } else { $topic_id = $topic_id_model->id; //更新 topic 表中 discuss_count字段+1 $topic_id_model->discuss_count = $topic_id_model->discuss_count + 1; if (!$topic_id_model->save(false)) { //var_dump($topic_id_model->errors); throw new ErrorException("话题添加失败2"); } } //根据topic_id 以及question_id查找是否以及存在 没有则插入 if (!TopicQuestion::model()->exists('topic_id=? AND question_id=?', array($topic_id, $id))) { //插入 topic_question 中 if (!$this->insertTopicQuestion($topic_id, $id)) { throw new ErrorException("添加失败"); } } //该问题实际的topic_id $true_topics[] = $topic_id; } //获取存在 topic_question 的 topic_id 并查找出其中多出来的 $criteria = new CDbCriteria(); $criteria->condition = "question_id=?"; $criteria->select = 'topic_id'; $criteria->params = array($id); $models = TopicQuestion::model()->findAll($criteria); //所有在topicQuestion中的id $all_topics = array(); foreach ($models as $model) { $all_topics[] = $model['topic_id']; } //获取需要删除的 topic_id $delete_topics = array_diff($all_topics, $true_topics); //var_dump($delete_topics); //从 topic_question 表中删除 并在topic 表中 discuss_count 字段-1 foreach ($delete_topics as $delete_topic) { if (!TopicQuestion::model()->deleteAll('topic_id=? AND question_id=?', array($delete_topic, $id))) { throw new Exception("更新失败"); } //disscuss_count字段-1 if (false === Topic::model()->updateByPk($delete_topic, array('discuss_count' => new CDbExpression("discuss_count-1")))) { throw new Exception("更新失败"); } } } $transaction->commit(); $this->success('修改成功', $this->createUrl('question/index', array('id' => $id))); } catch (Exception $e) { $transaction->rollBack(); exit($e->getMessage()); } }