CakePHP3のpatchEntitiesの使いどころについて
Cookbook3を見てイマイチ使い方が分からなかったので調べてみました。
結論を先に書くと、複数レコードのデータを一括でpatchしてくれるものだった(entitiesと複数形になっているくらいだからそりゃそうだ)
早速使ってみる
今回用意したDBテーブル
Postデータを作る画面
ブラウザの開発者ツールで見るとこんな感じ
※name属性が配列になっていて、1年分ということで12個あることになります。
Postされるデータの確認
patchEntities
に引数として渡すので先に中身を確認
dump($this->request->data);
問題のpatchEntitiesを使ってみる
こんな感じで使う
$entities = $table->patchEntities($entities, $this->request->data('MonthlyMarks'));
・args1:entityの配列データ
・args2:postの配列データ
ちゃんとバリデーションもやってくれます
レコード単位で処理してくれます。
凄い便利!
折角なのでpatchEntitiesされたentitiesをSaveしてみる
patchEntities
をした次の行に記述
if ($table->saveMany($entities)) {
$this->Flash->success(__d($pluralar, 'The {0} has been saved', __(Inflector::camelize($pluralar))));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__d($pluralar, 'The {0} could not be saved', __(Inflector::camelize($pluralar))));
何してくれてるの?
端的に言うとpatcheEntities
がEntity
単位で処理してくれます。(複数形だか(ry
そしてpatchEntities
されたものを最終的にsaveMany
で一括保存してます。
(CakePHP2のSaveAllみたいなことができます)
動かない場合は
patcheEntities
の引数がミスっている。
・args1:entityの配列構造
になっていること
・args2:postデータがpatchできる配列構造
になっていること
この辺を確認してみましょう。
まとめ
複数レコードの一括保存があった場合はpatchEntities
とsaveMany
を使いましょう。