test

CakePHP Note

データの保存

UPDATE:2009.11.20

データの保存にはモデルのsaveメソッドを使用します。レコード追加(insert)とレコード更新(update)のどちらの場合もsaveメソッドを使用します。saveメソッドではアソシエーションで設定した関連データは保存されません。(HABTMの中間テーブルを除く)

save(array $data, boolean or array $validate = true, array $whitelist )

$data

保存するデータの配列

$validate

データ検証を行うかどうかをtrueまたはfalseで指定。
または次のキーを持つ配列を指定する。配列で指定した場合は、saveメソッドの$fieldListは無視される。

  • validate
    • データ検証を行うかどうか(true/false)
  • callbacks
    • コールバックを実行するかどうか(true/before/after)
  • fieldList
    • データを更新するカラム名のホワイトリスト。

$whitelist

データを更新するカラム名のホワイトリスト。$validateのfieldListキーで指定した場合はそちらが優先される。

レコード追加(insert)とレコード更新(update)

saveメソッドがレコード追加(insert)とレコード更新(update)のどちらを行うかは、モデルにプライマリー・キーの値を指定しているかどうかでによります。プライマリー・キーの値が指定されていて該当レコードが存在すればレコードを更新し、該当レコードがないかプライマリー・キーが指定されていなければレコードを追加します。

コントローラに記述するデータ保存の一般的なコード。$this->dataにはフォームから送信されたデータが入っています。

$this->Post->create();
$this->Post->save($this->data);


データの保存に成功するとモデルの$id属性に該当レコードのプライマリー・キーが設定されます。

$this->Post->id;

レコード追加のための初期化

createメソッドを使うとデータを初期化できます。モデルにプライマリー・キーの値を空にし、各フィールドに初期値を設定します。

自動入力カラム

'created'はレコード作成日時、'updated'または 'modified'はレコード修正日時として自動入力されます。テーブル定義でデフォルト値を'null'に設定しておく必要があります。検証ルールでどちらかの日時だけを自動入力させる事も出来ます。

セキュリティ

$whitelist属性にデータを更新するカラム名をセットしておくと予期せぬカラムへのデータの更新を防ぐ事が出来ます。

$this->Post->whitelist = array('title','body');

saveメソッドの第3引数で更新するカラムを都度指定する事も出来ます。

$whitelist = array('title','body');
$this->Post->save($this->data,true,$whitelist );

saveField(string $fieldName, string $fieldValue, $validate = false)

1つの指定カラムの内容だけを更新します。事前にモデルのid属性にレコードIDをセットしておいてから実行します。

$this->Post->id=$id;
$this->Post->save('title','new title');

複数レコードまたは関連レコードの保存

saveAllメソッド。