1画面内で、複数レコードを一括で追加・更新する場面があり、あまりない状況だったので、あれこれ考えてみたのですが、CakePHPには「saveMany」という一括更新用のメソッドがあったので見てみることにしました。
見てみた結果はサンプルプラグインとして残してます。
データ構造としては、baserCMSのブログカテゴリ1つに対して、複数のレコードが紐づく場面がサンプルです。
ついでに baserCMSのHelperEventである bcListTableShowHead, bcListTableShowRow も使ってます。
想定している対象者
- baserCMSでウェブサイトを制作をしている方
- PHPer
サンプル
複数レコードを一括処理する
すごく特殊なことをする必要はなく、saveMany() にデータを渡してあげれば一気に保存してくれます。
https://github.com/fuchigam1/SampleMultiRecord/blob/a06ac130f967981ba3087231c979cc8bc203df97/Controller/SampleMultiRecordsController.php#L46
強いて挙げれば、view側で複数の形式を準備してあげることです。
<?php for ($i = 1; $i < 4; $i++): ?>
<?php echo $this->BcForm->input('SampleMultiRecord.'. $i .'.id', ['type' => 'hidden']) ?>
<?php echo $this->BcForm->input('SampleMultiRecord.'. $i .'.title', [
'type' => 'text', 'size' => 80,
'data-input-text-size' => 'full-counter',
'placeholder' => 'サンプルテキスト',
]) ?>
<?php echo $this->BcForm->error('SampleMultiRecord.'. $i .'.title') ?>
<?php endfor ?>
サンプルのviewはこちら。
https://github.com/fuchigam1/SampleMultiRecord/blob/main/View/SampleMultiRecords/admin/form.php#L24
ポイントとしては、error についても同じ形式で準備しておくと、バリデーションチェック時にエラーメッセージも該当行で表示できます。
最初はさすがにエラーメッセージはゴニョゴニョしないと表示できないだろうなぁ、セッションにでも取っておいて出してあげれば済むかとか思っていたんですが、なんのことはないそのまま行けちゃったというね、便利ですね。
ブログカテゴリ一覧画面に任意の列を追加する
SampleMultiRecordHelperEventListener で BcListTable.showHead, BcListTable.showRow を用いて実現します。
サンプルでは $View = $event->subject();
も使ってますが、実際のところ $event-data
使っておけば良いです。
まとめ
別にeachでやってsaveしても良いのですが、save時のcreate, updateを考えることなく実現できるのがメリットですね。
レコード毎に追加・編集画面を作るまでもないときには、saveManyを用いるのが便利です。