我的数据库,用户和个人资料中有两个表。配置文件将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));
}
我的问题是,当我在数据库中已有记录,在配置文件中,并且我提交了一个新表单,旧数据全部被删除,只有当前提交的值被更新,而它应该保留旧值并且只更新新的。
答案 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
)