スポンサードリンク

cake-logo
cake-logo

徐々にすすめている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側の設定も必要

スポンサードリンク