昔触っていたCakePHPを最近仕事でまたメインで使うようになったので色々思い出すために基礎的なことを振り返っていこうと思う。
保存するデータの形式
CakePHPではモデルを保存する時、以下の形式の配列で保存する。
$test = array(
[ModelName] => array(
[fieldname1] => 'value',
[fieldname2] => 'value2',
)
);
ほとんどの場合、この形式を意識する必要は無い。CakePHPのFormHelperやモデルのfindメソッドは全てこの形式に従っているため。FormHelperを使っていれば、$this->request->data
で簡単にこの形式のデータにアクセスできる
保存するメソッド
通常はsave
メソッドを利用する。このメソッドは配列の形式のデータを受け取り、保存する。新規・更新両方に利用できる。
Model::save(array $data = null, boolean $validate = true, array $fieldList = array())
デフォルトではsaveを実行するとバリデージョンが実行され、データの内容がチェックされる。第二引数にfalseを渡すことで、バリデーションを実行しないことも出来る。第三引数のフィールドのリストはセキュリティ向上のため、保存する対象のフィールドを制限することが出来る。
$fieldListを渡さない場合、変更する予定が無かった場合でも悪意のあるユーザーがフォームデータに任意のフォームのデータを追加できていしまう。(FormHelperを使ってフォームを生成していると自動でCakePHPのデータの形式で渡されるため)
ただし、SecurityComponentを利用すれば、上記の問題は回避出来る。
save完了後の挙動
saveが完了すると、モデルオブジェクトの$id
に保存されたデータのIDが自動でセットされる。
$this->Test->save($newData);
// 保存したID
$saveId = $this->Test->id;
新規作成・更新の判断
$this->Model->idがセットされていれば、このIDをプライマリーキーにもつ、レコードが更新される。それ以外は新しくレコードが作られる。
// 新規作成: IDがセットされていない
$this->Test->create();
$this->Test->save($this->request->data);
// 更新: IDに整数値がセットされている
$this->Test->id = 2;
$this->Test->save($this->request->data);
更新する時は、もう一つ方法があり保存する配列にIDを含めているとそのまま保存することが出来る。IDをプライマリーキーにもつレコードが更新される。
$data = array(
'Test' => array(
'id' => 1,
'name' => 'masaru',
'age' => 25,
);
);
$this->Test->save($data);
createメソッド
モデルの状態を初期化する。Model::$id
フィールドは初期化され、データベースのフィールドのデフォルト値を元にデータの配列の値をセットする。
Model::create(array $data = array())
第一引数にdataパラメータが渡された場合、データベースのフィールドのデフォルト値とマージされ、モデルのインスタンスはデータを保存する準備が完了する(データは$this->data
でアクセスできる)
createメソッドではデータベースフィールドの初期値がセットされるため、必ずInsert処理が行われる時のみ実行するようにする。
参考URL:【CakePHP】Model::create() の使い方と注意点 | バシャログ。 | 横浜でWeb制作を行うシーブレインスタッフによる技術情報ブログ http://bashalog.c-brains.jp/13/12/12-162507.php