更新和删除Yii中的相关模型(关系表)

时间:2013-11-17 20:08:23

标签: php mysql activerecord yii

更新
我有两个相关模型,即候选人和资格证书。他们之间有一对一的关系。我正在使用CActiveForm并希望对关系数据执行CRUD操作。我能够插入数据,但我遇到更新和删除问题。该函数显示$ id但是页面上显示的唯一内容 的 CandidateController

public function actionUpdate($id)
{
    echo $id;// this is printing the id on page
    $model = Candidate::model()->findByPk($id);
    $q =  Qualification::model()->findAllByAttributes(array('candidate_id' => $id));
    if (isset($_POST['Candidate'], $_POST['Qualification'])) {
        $model->attributes=$_POST['Candidate'];
        $q->attributes=$_POST['Qualification'];

        $error = false;
        $transaction = Yii::app()->db->beginTransaction();
        try {
            if (!$model->save()) {
                throw new CException(CHtml::errorSummary($model));
            }
            $q->candidate_id = $model->id;
            if (!$q->save()) {
                throw new CException(CHtml::errorSummary($q));
                echo $error;
            }
            $transaction->commit();
        } catch (Exception $e) {
            $transaction->rollBack();
            $error = $e->getMessage();
        }

        if (!$error) {
            $this->redirect(array('view','id'=>$model->id));
        }
    }
}



 public function actionView($id)
    {
        /*$this->render('view',array(
            'model'=>$this->loadModel($id),

        ));*/
        $model = $this->loadModel($id);
        $this->render('view',array(
            'Candidate'=>$model,
            'Qualification'=>Qualification::model()->findAllByAttributes(array('candidate_id' => $id))
    ));
    }

我无法理解如何使用编辑选项在表单中显示数据。

1 个答案:

答案 0 :(得分:1)

<强> UPDATING

看起来,您只有一对一的关系,所以如果是这种情况,您只需要将$q链接到特定的资格:

public function actionUpdate()
   {
    //load model
    $q=&$model->qualifications[0];
    if (isset($_POST['Candidate'], $_POST['Qualification'])) {
        $model->attributes=$_POST['Candidate'];
        $q->attributes=$_POST['Qualification'];

        $error = false;
        $transaction = Yii::app()->db->beginTransaction();
        try {
            if (!$model->save()) {
                throw new CException(CHtml::errorSummary($model));
            }
            if (!$q->save()) {
                throw new CException(CHtml::errorSummary($q));
                echo $error;
            }
            $transaction->commit();
        } catch (Exception $e) {
            $transaction->rollBack();
            $error = $e->getMessage();
        }

        if (!$error) {
            $this->redirect(array('view','id'=>$model->id));
        }
    }

通过一些调整,即循环和tabular data input,上述代码可以用于一对多。

<强>在删除

要删除,请修改Candidate::beforeDelete()以删除与其关联的所有资格,如下所示:

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

您应该在事务中将呼叫包裹到Candidate::delete()