【问题标题】:How does the update operation work in YiiYii 中的更新操作是如何工作的
【发布时间】:2013-12-23 15:49:59
【问题描述】:

我是 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 是否对所有内容执行此更新查询。这是如何工作的。

【问题讨论】:

  • 如果您查看与此关联的模型,您可能仍会引用此字段,您可能需要从数据库中删除该字段并使用 gii 重新生成模型。显然支持任何修改。顺便说一句,这是一个结构良好的问题,赞。

标签: php mysql yii


【解决方案1】:

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

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

$model = new User; 

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

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

现在isNewRecord 将是true/1

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

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

【讨论】:

  • 从文档中我看到插入和更新操作都使用了相同的保存功能。但是,它不会与正常的更新查询不同。我担心的是它不会影响数据库中的记录,如果它存储为新记录。
  • 但是您的模型已经存在值。所以它不会影响现有的 unchangegd 值。而且在您更新时它也不会作为新记录插入。
【解决方案2】:

在更新时保存记录中的所有字段是数据库的好习惯。想象两个人同时编辑同一条记录的场景。人 1 保存他的记录,而数据库只保存他的更改。第二个人保存了他的更改,这与用户 1 不同。结果是一个不能完全反映任何一个用户想要什么的记录。为了解决这个问题,Yii 保存了所有的值,即使是未更改的值。这样,至少有一个用户会很高兴!

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多