2015-04-22 107 views
1

在轉到我的問題之前,請先看看我的控制器。在保存模型之前在YII中獲取型號ID

這是我的控制器:

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,我想要得到的模型ID爲Yii::app()->vsm->preprocessing_kata方法。但是,我只知道$model->id可以在執行$model->save後生成。在這裏,如果LINE X中的方法已成功執行,我想保存模型。如果方法成功,該方法將返回true

我有一個替代解決方案: 爲了獲取模型ID,所以我必須查詢模型數據庫中的最新ID,並將其用於該方法。但是如果有人在同一時間訪問actionTambahKnowledge,我很害怕。因此從數據庫中檢索的模型ID變得不一致。例如,Mr.X訪問actionTambahKnowledge。我假設Mr.X的型號ID等於1。但是在同一時間,Y先生也訪問這個動作,並且Y先生得到相同的ID,因爲X先生沒有保存動作。最後,Mr.X成功保存了具有正確型號ID的模型和方法。 Y先生也成功保存了模型和方法,但Y先生填寫的數據將取代Mr.X的數據。

那麼,我可以在不保存模型的情況下獲取模型ID嗎?以及即使有人在同一時間訪問動作,我如何使用正確的模型ID保存模型和方法?

感謝和抱歉我的英語:)

回答

1

保存之前沒有任何訪問模型ID的方法。但是您可以首先將您的模型保存在交易中,然後檢查您的條件,如果不是這樣,則回滾交易:

$transaction=$model->dbConnection->beginTransaction(); 
$model->save(false); 
if(Yii::app()->vsm->preprocessing_kata($model->id)) 
    $transaction->commit(); 
else 
    $transaction->rollBack();