2013-12-23 3 views
4

Я новичок в структуре Yii. Я создал таблицу TblUser. Теперь у меня есть три столбца username, password и email. Я использую CRUD операций в Yii. Соединение с базой данных успешно выполнено. Мне также удалось создать новую запись в таблице. Теперь запись в базе данных читается какКак работает операция обновления в Yii

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

Теперь, в форме представления я удалил поле email комментирования (_form.php). Я использую эту форму для обновления оставшихся полей.

<?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(); ?> 

Чтобы использовать остальные поля я комментировал в email поле в _form.php. Теперь в моем контроллере у меня есть код обновления, как показано ниже:

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 

сейчас мой вопрос, почему обновляет неизменные значения снова вместо обновления только измененных значений. Выполняет ли этот запрос обновления для всех. Как это работает.

+0

Если посмотреть на модели, связанной с этим вы, вероятно, до сих пор это поле ссылки, вам может понадобиться, чтобы удалить поле из базы данных и регенерировать модель с использованием Gii. Очевидно, что он поддерживает любые изменения. Хорошо сложившийся вопрос, кстати, очень. –

ответ

1

В Yii, сохранение новой записи и обновление существующих записей аналогичны действиям.

При сохранении новой записи объект будет создан, как показано ниже.

$model = new User; 

Теперь у каждой модели есть флаг под названием isNewRecord. Будет установлено значение false/0. Для редактирования/обновления

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

Теперь isNewRecord будет true/1

на основе флага, Insert или запрос обновления будет выполняться.

Yii не знает, какие поля изменены. Таким образом, он просто обновляет все значения полей, связанные с моделью (таблица i.e) на основе флага.

+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

Смежные вопросы