アソシエーションされたモデルを一括で保存する方法と、うまくいかない時の対処法。

cake-logo

ちゃんとマニュアル読めよって話ですね。

マニュアル:データを保存する

環境:CakePHP 2.3.5

$data = array(
    'Article' => array('title' => 'My first article'),
    'Comment' => array(
        array('body' => 'Comment 1', 'user_id' => 1),
        array('body' => 'Save a new user as well', 'User' => array('first' => 'mad', 'last' => 'coder')),
    ),
);

$this->Article->saveAssociated($data, array('deep' => true));

deepを指定すると深い階層まで保存してくれます。

でも保存されない時

あるよねーそういう時。

配列が正しくできているか

debug($this->request->data);でまずは確認。
ちゃんとsaveできるような配列の形ができているでしょうか。

バリデーションを疑う
自分で設定したバリデーションに引っかかっているという間抜けなオチもしばしば。
$this->Model->save($this->request->data, array('validate' => false));
とすると、そのsaveではバリデーション無効化。

キャッシュを疑う
tmp/chache/modelsの下のキャッシュファイルを削除
これはまだ遭遇したことないけど、あるらしい。

ループを疑う
これは結構きづかない。
アソシエーションが深くなると、なんだかループしちゃったみたいな時。

A hasMany B
  B hasMany C
    C hasMany D
      D hasOne A

みたいなね。D の A_id が保存できない。

[googlead]

$this->request->data[A][B][C][D][id] = 1;
$this->request->data[A][B][C][D][A_id] = 123;
$this->A->save($this->request->data[A]);

↑上みたいにやってもだめだった。

せっかくsaveAssociated の deep を覚えたので、
一回で保存しちゃいたいとこだけど、できません。エラーも出ません。
しれ〜っと保存できたふりして、データベース確認すると保存されていな…。

Aのid と DのA_id が競合してるのかなんなのか。
でも何となくは想像できるよね。

なので、

$this->request->data[D][id];
$this->request->data[D][A_id];
$this->D->save($this->request->data[D]);

って、別にしてやればOKです。
ちょっとめんどくさいけどね。

何かありましたらコメントをどうぞ

comments powered by Disqus

人気の記事

950 Points チリ出身のギタリストが弾くドラゴンボールZがむちゃくちゃかっこいい…
774 Points Wordpress + Heroku + PostgreSQL + Amazon S3 = ¥0 / 無料でサイト運営
700 Points Rubyのチートシート 変数 / クラス / モジュール
524 Points Rubyのチートシート / アクティブサポート
451 Points 紙のデザイナーがウェブ開発できるようになるまでに必要なこと
435 Points Rails / Google Analyticsのデータを使って分析や管理画面のためのグラフをつくる
323 Points RailsとHerokuでノーティフィケーションをプッシュする / PusherとTurbolinksの兼ね合い
222 Points Rails / RSpec テスト書いたことない メンドクサイ(n´Д`)という時のチートシート
193 Points Rails / Ajaxを使って画面遷移しない一時保存機能をつける
193 Points Protractorでスクレイピングしてみた