【鋭利団体】PK-Brothers鋭利団体PK-Brothers丸くならない。我々のHOME我々について我々へのお問い合わせCakePHPで複数レコードを一括でバリデーションをかけて一括で保存する方法http://pk-brothers.com/1588/CakePHPで複数レコードを一括でバリデーションをかけて一括で保存する方法2014年05月10日(土)さぁ、今回もCakePHPのお話にしましょう。CakePHPで一括saveする際にバリデーションチェックの有無を引数により制御できるのですが、結構バリデーションをかけるタイミングを変えたいシュチュエーションが発生することが多かったのでおさらいしてみましょう。複数レコードの場合は配列マジックが結構するどいので注意する点が多かったので自らのリマインドも含めて。CakePHPで複数レコードを保存する方法はどうやるの?CakePHPの「saveAll」関数を使おう!全然知らない人はCakePHPでのsave関数形は以下を参照してみよう!http://book.cakephp.org/2.0/ja/models/saving-your-data.htmlsaveAll関数に渡す配列の形式は?これも結構つまずきやすい個所ですよね?僕は何回もつまずきましたよ・・・これがCakePHPの配列マジックですよね。));こんな感じに配列を整理してsaveAll関数に渡してやればとりあえずOKですぞい。複数のレコードをView側より受け取ってごにょごにょ・・・とかいう処理も多いですよね。その場合はView側でFromヘルパーを用いて対応することができます。);こんな感じでっしゃろ。なんとなく配列の形式がイメージできるような感じなのでわかりますよね?この例は固定値で0,1,2・・・とやっていますが、動的に複数レコードを生成する感じにしたい場合はfor文とかで0,1・・・の部分に変数を定義してあげればいいですね。先ほどのView側のFormよりPOST値を取得できます。そのPOST値の中身を見ると一番最初に書いた配列構造となっていると思います。);とかで中身を取得できると思います。指定しないとうまく保存できないので注意。これでうまく複数レコードを保存または更新できると思います。それと同時にバリデーションもチェックしてくれています。今回は任意にバリデーションをかけるということでしたので、まだ続きます。saveAllでバリデーションチェックのみする更新や登録をしないでバリデーションチェックのみを行いたい場合等もなかにはあると思います。確認画面とか確認画面とか。その際には同じsaveAllで引数をコントロールすることでできます。)を付与することによってバリデーションチェックのみを行うようになります。任意のパラメータを配列に含む場合は要チェックつまりね。配列マジックにはまるんだよこれが。僕がつまずいたのは以下のパターンでつまずきました。これは正常にできないっぽいです。));こんな感じで配列構造が意図していない形になってしまうとアウトなようです。任意のパラメータを渡したい場合はモデル配列の外で指定しましょう。安西先生...検索で取得した配列をsaveAll配列にしたいです...これはきちんとモデルのbelongsToとかhasManyとかを設定していれば問題ないはずなんですが、特に指定していない場合は厄介になるはずです。しても設定したくない人っているもんね。そんなときはCakePHPには配列をいろいろいじれるたくましい関数があるので勉強してみてもよいと思います。Set関数にかわり、CakePHP2系ではHash関数が用意されているので、Hash関数を使いましょう。この編はドキュメントを見て自分でいいものを見つけて判断していくのがよいでしょう。今回もこの辺で失礼するでござる。PK-Brothers.。