在更新时,跳过更新yii的某些属性

时间:2013-11-21 06:43:18

标签: php yii model

我需要停止更新某些值,即使那些设置为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'];

我在保存时需要跳过某些属性。

$模型 - >保存();

3 个答案:

答案 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);
}