更新操作如何在Yii中工作

时间:2013-12-23 15:50:00

标签: php mysql yii

我是Yii框架的新手。我创建了一个表TblUser。现在,我有三列usernamepasswordemail。 我在Yii中使用CRUD操作。已成功连接到数据库。我也能够在表格中创建一条新记录。 现在,数据库中的条目显示为

+----+----------+----------+--------------------+
| id | username | password | email              |
+----+----------+----------+--------------------+
|  1 | test1    | pass1    | test1@example.com  |
|  2 | test2    | pass2    | test2@example.com  |
|  3 | test3    | pass3    | test3@example.com  |
+-----------------------------------------------+

现在,在视图表单中,我通过注释(_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`='test2@example.com' WHERE `tbl_user`.`id`=2  

而不是

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

现在我的问题是为什么再次更新未更改的值而不是仅更新更改的值。 Yii是否对所有内容执行此更新查询。这是如何工作的。

3 个答案:

答案 0 :(得分:1)

在Yii中,新记录保存和更新现有记录是类似的操作。

保存新记录时,对象将按如下方式创建。

$model = new User; 

现在每个模型都有一个名为isNewRecord的标志。这将设置为false / 0。 用于编辑/更新

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

现在isNewRecord将为true / 1

根据标志,将执行插入或更新查询。

Yii不知道哪些字段已更改。所以它只是根据标志更新与模型相关的所有字段值(即表格)。

答案 1 :(得分:0)

在更新时保存记录中的所有字段是数据库的良好做法。想象两个人同时编辑同一记录的情景。人1保存他的记录,数据库只保存他的更改。第二个人保存他的更改,这些更改与用户1不同。结果是记录不能完全反映用户想要的内容。为了解决这个问题,Yii保存了所有的值,甚至是未更改的值。这样,至少有一个用户会很高兴!

答案 2 :(得分:0)

如果您只想更新某些列,可以使用update()函数而不是save()函数执行此操作。示例:

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

Yii不会自动检测哪些列已被修改,因此如果您只想更新已更改的列,则必须跟踪。但是,对于更新密码表单或更新状态或类似情况,您可以使用update()代替save(),因为您只知道一个字段正在更改。

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