2013-12-23 143 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