【CakePHP】Model::create()のメモ。

Model::create()を行った際、プライマリーキーを除いた全てのカラムに設定されている初期値がセットされる。
そのためレコード更新の時、初期値が設定されているカラムの値をセットせずにModel::create()、Model::save()を行うと、意図した動作にならない場合があるので注意。

具体例として、statusなどのカラムを初期値1で設定しており、どこかのタイミングで2に書き換わっていたとする。そしてそのレコードを編集する際にステータスも「2」であると明示的にセットしない限り、修正完了した時点でステータスは1に戻ってしまう。

ということである。

IDさえセットしてしまえば、他の渡されなかった値はDBのレコードをそのまま維持してくれると勘違いしていたが違った模様。

ちなみにコアコードは下記のようになっている。

public function create($data = array(), $filterKey = false) {
	$defaults = array();
	$this->id = false;
	$this->data = array();
	$this->validationErrors = array();

	if ($data !== null && $data !== false) {
		$schema = (array)$this->schema();
		foreach ($schema as $field => $properties) {
			if ($this->primaryKey !== $field && isset($properties['default']) && $properties['default'] !== '') {
				$defaults[$field] = $properties['default'];
			}
		}

		$this->set($defaults);
		$this->set($data);
	}

	if ($filterKey) {
		$this->set($this->primaryKey, false);
	}

	return $this->data;
}

10行目でおもいっきり初期値セットしてるがな。