在Yii中一起保存和更新控制器

时间:2013-03-02 09:55:51

标签: activerecord model yii controller

我的数据库,用户和个人资料中有两个表。配置文件将user_id作为主键。每个用户只能有一个配置文件。当我上传图像文件时,其名称存储在具有该user_id的配置文件表中。当在配置文件表中有其他要更新的字段时,我首先检查是否已存在具有该user_id的记录。在我的个人资料模型中,我写了

public function checkForSaveOrUpdate()
{
    return self::model()->findByAttributes(array('user_id'=>Yii::app()->user->id));
}

我的控制器文件看起来像这样

    public function actionCreateInfo()
      {
        $profile = new Profile;
        $profile->user_id = Yii::app()->user->id;

        if(isset($_POST['Profile']))
        {
            if($profile->checkForSaveOrUpdate() === null)
            {
                $profile->attributes = $_POST['Profile'];
                if($profile->save())
                    Yii::app()->user->setFlash('success','Profile has been saved successfully');
            }
            elseif($profile = $profile->checkForSaveOrUpdate())
            {
                $profile->attributes = $_POST['Profile'];
                if($profile->update())
                    Yii::app()->user->setFlash('success','Profile has been updated successfully');
            }

            $this->redirect(array('index'));
        }

        $this->render('createInfo',array('profile'=>$profile));
}

我的问题是,当我在数据库中已有记录,在配置文件中,并且我提交了一个新表单,旧数据全部被删除,只有当前提交的值被更新,而它应该保留旧值并且只更新新的。

3 个答案:

答案 0 :(得分:1)

如果您将模型设置为:

$model = new YourModel;

您将$model->isNewRecord设置为true

var_dump($model->isNewRecord); // true, in this case you use $model->save()

当您找到记录时,相同的属性将具有相反的值:

$model = YourModel::model()->findByPk(1);
var_dump($model->isNewRecord); // false - and now you use $model->update(), instead.

答案 1 :(得分:0)

将您的功能更改为静态功能

 public static function checkForSaveOrUpdate()
    {
        return self::model()->findByAttributes(array('user_id'=>Yii::app()->user->id));
    }

然后将操作修改为

public function actionCreateInfo()
{
        $profile = Profile::checkForSaveOrUpdate();
        if($profile===null)
        {
            $profile=new Profile;
            $profile->user_id = Yii::app()->user->id;
        }
        if(isset($_POST['Profile']))
        {
            $profile->attributes = $_POST['Profile'];
            if($profile->save())
                Yii::app()->user->setFlash('success','Profile has been saved successfully');
           $this->redirect(array('index'));
        }

        $this->render('createInfo',array('profile'=>$profile));
}

答案 2 :(得分:0)

您的POST数据可能包含所有模型属性,包括设置为空字符串的用户留空的属性;除非模型规则另有说明,否则空字符串是大规模分配的可接受值;您实际使用$profile->attributes = $_POST['Profile'];进行大量任务。

一种解决方案是取消设置您不想更新的属性,例如:控制器中包含空字符串的那些。

但是这种规则应该在模型中定义,并通过调用validate()方法触发,您现在通过调用update()来跳过该方法。您最好致电save(),因为内部调用validate()而不是update()

默认值的规则定义如下:

array(
    'attr_name',
    'default',
    'setOnEmpty' => true,
    'value' => null
)