在回答我的问题之前,请先看看我的控制器。
这是我的控制者:
public function actionTambahKnowledge(){
$model = new Dokumen;
if(isset($_POST['Dokumen']))
{
$model->attributes=$_POST['Dokumen'];
if($model->validate()){
if(Yii::app()->vsm->preprocessing_kata($model->id)){ //LINE X
$model->save(false)
Yii::app()->user->setFlash('tambahknowledge','Knowledge baru berhasil ditambahkan');
$this->redirect(array('tambahKnowledge'));
}
}
}
$this->render('tambahKnowledge',array('model'=>$model));
}
在LINE X
中,我想获取Yii::app()->vsm->preprocessing_kata
方法的模型ID。但是,我只知道在$model->id
执行后可以生成$model->save
。在这里,如果LINE X
中的方法已成功执行,我想保存模型。如果方法成功,该方法将返回true
。
我有另一种解决方案:
为了获取模型ID,我必须查询模型数据库中的最新ID,并将其用于该方法。但我担心是否有其他人同时访问actionTambahKnowledge
。因此,从数据库中检索的模型ID变得不一致。例如,Mr.X访问actionTambahKnowledge
。我假设Mr.X的模型ID等于1
。但是同时,Y先生也可以访问这个动作而且Mr.Y得到相同的ID,因为Mr.X还没有保存动作。最后,Mr.X成功地使用正确的型号ID保存了模型和方法。除了模型和方法之外,Y先生也取得了成功,但是Mr.Y填充的数据将取代Mr.X的数据。
那么,我可以在不保存模型的情况下获取模型ID吗?以及如何使用正确的模型ID保存模型和方法,即使有其他人同时访问该操作?
感谢和抱歉我的英语:)
答案 0 :(得分:1)
在保存之前没有任何方法可以访问模型ID。但您可以先将模型保存在事务中,然后检查您的情况,如果不是,则回滚事务:
$transaction=$model->dbConnection->beginTransaction();
$model->save(false);
if(Yii::app()->vsm->preprocessing_kata($model->id))
$transaction->commit();
else
$transaction->rollBack();