Help us understand the problem. What is going on with this article?

CakePHPのsaveメソッドとcreateメソッドの基礎

More than 3 years have passed since last update.

昔触っていた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

masarufuruya
Webメインのフリーランスエンジニア。React Nativeでアプリ作ってます。React/React Native/Vue/Ruby/PHP
engineerlife
技術力をベースに人生を謳歌する人たちのコミュニティです。
https://community.camp-fire.jp/projects/view/280040
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away