ОБНОВЛЕНО
У меня есть две связанные модели – кандидат и квалификация. У них есть отношения один к одному между ними. Я использую 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)) )); }
Я не могу понять, как сделать данные видимыми в форме с помощью опции редактирования.
ОБНОВЛЕНИЕ
Кажется, у вас есть только отношения «один к одному», поэтому, если это так, вам нужно связать $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)); } }
При некоторых настройках, т. Е. При вводе петли и табличных данных вышеуказанный код может работать для одного-ко-многим.
УДАЛЕНИЕ
Для удаления Candidate::beforeDelete()
чтобы удалить все связанные с ним квалификации следующим образом:
public function beforeDelete(){ foreach($this->qualifications as $q) $q->delete(); return parent::beforeDelete(); }
Вы должны перенести вызов в Candidate::delete()
в транзакции.