web-dev-qa-db-ja.com

Yiiのアクティブレコードの特定のフィールドのみを更新するにはどうすればよいですか?

5つのプロパティ(DB列)を持つモデル(ActiveRecord)があります。
特定のレコードをフェッチし、3フィールド(他の2つのフィールドはすべきではない)を持つフォームにデータを入力します更新します)。
次に、特定のフィールドを変更して保存を押します。

フォームにないフィールドに触れずに、レコードを更新するにはどうすればよいですか?

10
lvil

コントローラに次のようなメソッドを作成できます。

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,
        ));
}

要約すると、アクションは以下を実行します。

  • データベースからモデルをロードします(データベースから設定されたすべての値を使用)
  • フォームの値を割り当てます(これにより、フォームで送信された属性のみが上書きされます)
  • モデルはデータベースに保存されます

したがって、フォームにすべてのモデル属性を含める必要はありません。フォームで定義されているものは、モデルで変更されます。フォームの変更を設定する前にモデルがデータベースからロードされるため、他のすべてのフィールドは変更されません。

2
Stelian Matei

mazzucci で指摘されているアプローチは、必要以上に複雑です。これを試して:

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