LoginSignup
0

[baserCMS]複数レコードを一括で追加・更新するサンプル

Last updated at Posted at 2023-08-27

1画面内で、複数レコードを一括で追加・更新する場面があり、あまりない状況だったので、あれこれ考えてみたのですが、CakePHPには「saveMany」という一括更新用のメソッドがあったので見てみることにしました。

見てみた結果はサンプルプラグインとして残してます。
データ構造としては、baserCMSのブログカテゴリ1つに対して、複数のレコードが紐づく場面がサンプルです。
ついでに baserCMSのHelperEventである bcListTableShowHead, bcListTableShowRow も使ってます。

想定している対象者

  • baserCMSでウェブサイトを制作をしている方
  • PHPer

サンプル

sc_blog_category_index.png

sc_sample_multi_record.png

複数レコードを一括処理する

すごく特殊なことをする必要はなく、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を用いるのが便利です。

参考記事

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0