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

Why do not you register as a user and use Qiita more conveniently?
  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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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