我是Yii框架的新手。我创建了一个表TblUser
。现在,我有三列username
,password
和email
。
我在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是否对所有内容执行此更新查询。这是如何工作的。
答案 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