更新
我有两个相关模型,即候选人和资格证书。他们之间有一对一的关系。我正在使用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))
));
}
我无法理解如何使用编辑选项在表单中显示数据。
答案 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()
。