Php 如何仅更新Yii中活动记录的特定字段?

Php 如何仅更新Yii中活动记录的特定字段?,php,activerecord,yii,model,sql-update,Php,Activerecord,Yii,Model,Sql Update,我有一个模型(ActiveRecord),它有5个属性(DB列)。 我获取一条特定记录并填充一个包含3个字段的表单(另外两个字段不应更新)。 然后我更改一个特定字段并按save 如何更新记录,而不接触表单中不存在的字段?您可以在控制器中创建如下方法: public function actionUpdate($id) { $model = $this->loadModel($id, 'User'); if (isset($_POST['User']))

我有一个模型(ActiveRecord),它有5个属性(DB列)。
我获取一条特定记录并填充一个包含3个字段的表单(另外两个字段不应更新)。
然后我更改一个特定字段并按save


如何更新记录,而不接触表单中不存在的字段?

您可以在控制器中创建如下方法:

public function actionUpdate($id) {
        $model = $this->loadModel($id, 'User');


        if (isset($_POST['User'])) {
            $model->setAttributes($_POST['User']);

            if ($model->save()) {
                $this->redirect(array('view', 'id' => $model->id_user));
            }
        }

        $this->render('update', array(
            'model' => $model,
        ));
}
总之,该操作执行以下操作:

  • 从数据库加载模型(使用数据库中设置的所有值)
  • 在表单中指定值(这将仅覆盖表单中发送的属性)
  • 模型保存在数据库中

因此,您不需要在表单中包含所有模型属性。表单中定义的内容将在模型中更改。所有其他字段都不会更改,因为在设置表单更改之前,模型是从数据库加载的。

指出的方法比必要的方法更复杂。试试这个:

YourTable::model()->updateByPk($id, array(
    'field1' => NewVal1,
    'field2' => NewVal2,
    'field3' => NewVal3
));

您可以传递第二个参数来保存方法,其中包含应更新的字段列表@Sanket您能更明确地说明什么不起作用吗?我现在不记得了,我不应该这么快判断答案。请编辑答案(可能需要添加一些空格)。我会投票给你一个中立的答案,很抱歉给你带来不便。我会再试一次,并让您知道。是否有其他方法可以避免从数据库中获取数据?很好,但onBeforeSave事件无法通过这种方式触发。