Cakephp WEB開発

[Cakephp4]複数関連モデルのフォーム作成

※本サイトはPR表記を含みます。

1つの入力画面に複数のモデルのフォームを作りたい時のお話。

通常 Cakephp で Form を作成する時は Formヘルパー を使用して開発すると思います。

 

$this->Form->control('フォーム名'); というような感じで作っていきますね。

複数のモデルを扱う場合、フォーム名の箇所を「model.form」という感じで小文字の単数形で記述すると扱えるようになります。

 

そこで注意したいこと。 Cakephp4 では、アソシエーションによって、フィールド名の規約は多少変動します

このあたり忘れやすく、再度ドキュメントを探すのに小一時間かかったので(かかりすぎやっちゅーねん)、自分のブログに残しておこうかと思った次第。

フォームで複数モデルを扱う場合のフォーム名規約

$this->Form->create($article);

// Article コントロール
echo $this->Form->control('title');

// Author コントロール (belongsTo)
echo $this->Form->control('author.id');
echo $this->Form->control('author.first_name');
echo $this->Form->control('author.last_name');

// Author の profile (belongsTo + hasOne)
echo $this->Form->control('author.profile.id');
echo $this->Form->control('author.profile.username');

// 別々の入力として、
// Tags コントロール (belongsToMany)
echo $this->Form->control('tags.0.id');
echo $this->Form->control('tags.0.name');
echo $this->Form->control('tags.1.id');
echo $this->Form->control('tags.1.name');

// 結合テーブルの入力 (articles_tags)
echo $this->Form->control('tags.0._joinData.starred');
echo $this->Form->control('tags.1._joinData.starred');

// Comments コントロール (hasMany)
echo $this->Form->control('comments.0.id');
echo $this->Form->control('comments.0.comment');
echo $this->Form->control('comments.1.id');
echo $this->Form->control('comments.1.comment');

POST送信後はnewEntity()patchEntity()をして、save()などをするパターンが多いです。

その際、デフォルトで各モデルテーブルに定義されたvalidationDefault()が適用される形になります。(それ以外のバリデートの適用も可能)

通常モデルでバリデートを指定する

$this->Models->newEntity($this->request->getData());

アソシエートモデルのバリデートを指定する

$this->Models->newEntity($this->request->getData(), ['associated' => ['hogeModels' => ['validate' => 'default']]]);

という形でアソシエート先のバリデートを読み込める形になってます。

default というのは、モデルテーブルで定義した validationDefault() のバリデートが走る仕組みです。

もちろん、違う名前も指定できますが、命名規約的に接頭辞に validation を付与することを忘れないでおきましょう。

・【Cakephp4】関連データの入力を作成

https://book.cakephp.org/4/ja/views/helpers/form.html#associated-form-inputs

・【Cakephp4】アソシエーションに異なるバリデーションセットを使用

https://book.cakephp.org/4/ja/orm/validation.html#using-different-validators-per-association

 

-Cakephp, WEB開発
-