2013-12-23 88 views
4

我是Yii框架的新手。我創建了一張表TblUser。現在,我有三列username,passwordemail。 我在Yii使用CRUD操作。與數據庫的連接已成功完成。我還能夠在表格中創建一個新記錄。 現在在數據庫中的條目作爲Yii更新操作如何工作

+----+----------+----------+--------------------+ 
| id | username | password | email    | 
+----+----------+----------+--------------------+ 
| 1 | test1 | pass1 | [email protected] | 
| 2 | test2 | pass2 | [email protected] | 
| 3 | test3 | pass3 | [email protected] | 
+-----------------------------------------------+ 

現在,在視圖形式I通過註釋(_form.php這個)除去字段email讀取。我正在使用此表單來更新剩餘的字段。

<?php 
    /* @var $this TblUserController */ 
    /* @var $model TblUser */ 
    /* @var $form CActiveForm */ 
    ?> 

    <div class="form"> 

    <?php $form=$this->beginWidget('CActiveForm', array(
      'id'=>'tbl-user-form', 
      'enableAjaxValidation'=>false, 
    )); ?> 

      <p class="note">Fields with <span class="required">*</span> are required.</p> 

      <?php echo $form->errorSummary($model); ?> 

      <div class="row"> 
        <?php echo $form->labelEx($model,'username'); ?> 
        <?php echo $form->textField($model,'username',array('size'=>60,'maxlength'=>128)); ?> 
        <?php echo $form->error($model,'username'); ?> 
      </div> 

      <div class="row"> 
        <?php echo $form->labelEx($model,'password'); ?> 
        <?php echo $form->passwordField($model,'password',array('size'=>60,'maxlength'=>128)); ?> 
        <?php echo $form->error($model,'password'); ?> 
      </div> 
<!--  
      <div class="row"> 
        <?php echo $form->labelEx($model,'email'); ?> 
        <?php echo $form->textField($model,'email',array('size'=>60,'maxlength'=>128)); ?> 
        <?php echo $form->error($model,'email'); ?> 
      </div> 
-->  
      <div class="row buttons"> 
        <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?> 
      </div> 

    <?php $this->endWidget(); ?> 

要使用我在_form.php這個評論的email標區的其餘部分。 現在在我的控制器我有更新的代碼如下所示:

public function actionUpdate($id) 
     { 
       $model=$this->loadModel($id); 

       // Uncomment the following line if AJAX validation is needed 
       // $this->performAjaxValidation($model); 

       if(isset($_POST['TblUser'])) 
       { 
         $model->attributes=$_POST['TblUser']; 
         if($model->save()) 
           $this->redirect(array('view','id'=>$model->id)); 
       } 

       $this->render('update',array(
         'model'=>$model, 
       )); 
     } 

當我看到我的查詢日誌,更新查詢是

UPDATE `tbl_user` SET `id`=2, `username`='1234', `password`='1234', `email`='[email protected]' WHERE `tbl_user`.`id`=2 

,而不是

UPDATE `tbl_user` SET `password`='1234' WHERE `tbl_user`.`id`=2 

現在我的問題是爲什麼要重新更新未更改的值,而不是僅更新已更改的值。 Yii是否對此做了更新查詢。這個怎麼用。

+0

如果你看看這個,你可能會仍然有這個字段引用相關的模型,你可能需要從數據庫中刪除字段並使用GII再生模型。顯然會備份任何修改。順便說一下,一個很好的問題,榮譽。 –

回答

1

在Yii中,新記錄保存和更新現有記錄是類似的操作。

在保存新記錄的同時,將創建如下的對象。

$model = new User; 

現在每個模型都有標誌叫做isNewRecord。這將被設置爲false/0。 對於編輯/更新

$model=$this->loadModel($id); 

現在isNewRecordtrue/1

基於所述標誌,插入或更新查詢將被執行。

Yii不知道哪些字段已更改。所以它只是基於標誌更新與模型(即表)相關的所有字段值。

+0

從文檔中我看到,插入和更新操作都使用相同的保存函數。但是,這與正常的更新查詢沒有什麼不同。我擔心的是,如果將它作爲新記錄存儲,它會不會影響數據庫中的記錄。 – user3004356

+0

然而你的模型已經存在價值。所以它不會影響現有的unchanegd值。而且它不會在更新時插入爲新記錄。 –

0

保存更新記錄上的所有字段對於數據庫來說是很好的做法。想像兩個人同時編輯同一個記錄的場景。人員1保存他的記錄,並且數據庫只保存他的更改。第二個人保存他的變化,這與用戶1不同。結果是沒有完全反映用戶想要的記錄。爲了解決這個問題,Yii保存了所有的值,甚至保存不變的值。這樣,至少有一個用戶會很開心!

0

如果您只想更新某些列,您可以使用update()函數代替save()函數。例如:

$model->update(array('password')); 

Yii不會自動檢測哪些列已被修改,因此如果您只想更新已更改的列,則必須跟蹤。但在更新密碼錶單或更新狀態或類似的情況下,爲什麼要使用update()而不是save(),因爲您知道只有一個字段正在更改。

參考:http://www.yiiframework.com/doc/api/1.1/CActiveRecord#update-detail