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行目でおもいっきり初期値セットしてるがな。