我需要停止更新某些值,即使那些设置为POST数组。要做到这一点,我在yii规则中使用不安全。
array('id', 'unsafe', 'on'=>'update'),
仍然有这个,我无法跳过更新的ID。
如何用yii完成?
下面是我的规则函数..
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('name, body, created_date', 'required'),
array('name', 'length', 'max'=>128),
array('body', 'length', 'max'=>512),
array('id', 'unsafe', 'on'=>'update'),
// The following rule is used by search().
// @todo Please remove those attributes that should not be searched.
array('id, name, body, created_date', 'safe', 'on'=>'search'),
);
}
更新1
$ model-> attributes = $ _POST ['User'];
我在保存时需要跳过某些属性。
$模型 - >保存();
答案 0 :(得分:2)
在控制器中创建新模型实例时,需要声明方案 例如 如果你的声明是这样的
$myModelInstance = new MyModel();
您需要将其更改为
$myModelInstance = new MyModel('update');
但是,如果您使用其中一种活动记录的查找方法进行保存,则会自动将其设置为“更新”,如下所示:http://www.yiiframework.com/doc/api/1.1/CActiveRecord#save-detail
如果您使用其他逻辑来声明模型,则只需使用setScenario函数
$myModel->setScenario("update");
答案 1 :(得分:1)
如Manquer所述,您的方案可能未设置为更新。正确的更新顺序将涉及加载现有对象实例,分配变量然后保存它们。我个人永远不会只是实例化一个对象并给它一个不同的场景,我想这就是问题。
// Load the existing object first
$user = User::model()->findByPk(..);
// Assign everything that has either a validation rule or is added as "safe"
$user->attributes = $_POST['User'];
// Save the updated version
$user->save();
Yii知道不更新'id'(如果它被正确定义为数据库中的主键)。无需将其标记为不安全。 所以:确保实例是从db加载的($ user-> isNewRecord应为FALSE)并且该表具有PK。然后更新所需的属性。
您也可以只通过“清除”$ _POST来更新特定属性,或者当您调用save时,只需将其称为$ user-> save(true,array('name','body'))仅更新例如姓名和身体。
答案 2 :(得分:0)
对于 Yii2:
如果您不想使用场景,因为您必须手动应用它们,您可以在 when
中使用 rules()
:
['moduleID', 'required', 'when' => function($model, $attribute) {
return $model->isNewRecord;
}],
或者,如果您对属性有很多规则并且不想将 when
添加到所有规则中,您可以简单地禁止在 beforeSave()
方法中进行更改:
public function beforeSave($isInsert) {
$attribute = 'moduleID';
if (!$isInsert && $this->isAttributeChanged($attribute)) {
$this->addError($attribute, 'You cannot change this.');
}
return parent::beforeSave($isInsert);
}