スポンサードリンク

徐々にすすめているCakePHPの開発。
普通のプログラマーならもうちょっと早く開発できているのかもしれません。
まだまだ、詰まる箇所があります。
今回は複数のテーブルの保存をしてみました。
スポンサードリンク
保存するメソッドはsaveAll
モデルに保存する方法のメソッドはいろいろありますが、
結構使うのはsaveメソッドです。
save
$this->Model->save(array $data = null, boolean $validate = true, array $fieldList = array())
・validate バリデーションの有効または無効について、trueまたはfalseを指定します。デフォルトはtrue。
・fieldList 保存する対象のフィールドのリストを指定します。
fieldListには連想配列でカラム名とデータを入れます。
(例)
$data = array( 'Model' => array( 'first_name' => 'Yamada', 'last_name' => 'Taro' ) )
大体、フォームからのデータを保存するので
$this->Model->save($this->request->data)
で、受け取って保存してました。
でも、これだと基本1つのモデルのみの保存で
アソシエーションモデルは保存されないので
アソシエーションモデルまで保存されるメソッドを使いました。
色々ありますが、saveAllが簡単そうです。
saveAll
$this->Model->saveAll(array $data = null, array $options = array())
saveAll は saveMany と saveAssociated のラッパーで、
引数のデータ内容をみて、 saveMany か saveAssociated のどちらを使うのかを決定してくれます。
データの添字が数値であれば saveMany を、それ以外は saveAssociated を呼び出します。
じゃあ、saveAssociatedを使えばいいじゃん!って話ですが、
まぁ、それは置いておいて・・・
引数にfieldlistを渡せばアソシエーションモデルも保存されます。
$this->Model->saveAll($this->request->data)
belognsToとhasManyの違い
saveAllを使ってモデルの保存をしてみたところ
できるデータとできないデータがあって迷いました。
belongsToとhasManyではデータの渡すか形が少し違うようです。
belongsToの場合は【modelName.fieldName】の形式でいいので
普通にsaveする感じでフォームを作ってそのまま保存されます。
UserPostとPostがbelongsToの関係の場合
UserPostControllerで動くビューファイルには
echo $this->Form->input('UserPost.memo',array('label' => false,'type' => 'text')); echo $this->Form->input('UserPost.coment',array('label' => false,'type' => 'text')); echo $this->Form->input('User.title',array('label' => false,'type' => 'text'));
上記のように記述します。
PostとUserPostがhasManyの関係の場合
hasManyの場合はネストされた連想配列で保存するようなので
【modelName.0.fieldName】の形にします。
PostControllerで動くビューファイルには
echo $this->Form->input('UserPost.0.memo',array('label' => false,'type' => 'text')); echo $this->Form->input('UserPost.0.coment',array('label' => false,'type' => 'text')); echo $this->Form->input('User.title',array('label' => false,'type' => 'text'));
上記のように書きます。
複数ある場合は「0」の部分が1.2.3….となります。
※hasOneの関係はbelongsToと同じ考え方で良いみたいです。
1対1の関係だからでしょうね。
スポンサードリンク
saveAllで保存ができない場合
これもまた、悩んだんですが、
saveAllしたときに保存されないけど
エラーも出ないということがありました。
どうも、バリデートエラーが出ているようで
ただ単にバリデートエラーが表示されていなかっただけ見たいでした。
バリデートでエラーがでている可能性があるのでエラーの確認のチェックは
print_r($this->Model->validationErrors);
以上のように書くとバリデートエラーが確認できます。
バリーデートエラーが出ないのは
バリデートかけているカラムの名前が違っていたりして
表示項目がない場合があるので
おかいしなって思ったら確認するといいです。
(参考)
[CakePHP]deleteAll()やdelete()の$cascadeはmodel側の設定も必要
スポンサードリンク