Cakephp プログラミング

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

一つの入力画面に複数のモデルのフォームを作りたい時って、ありますよね? 通常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(), ['validate' => 'custom']);

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

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

という感じで各バリデートを読み込める形になっております。

 

・【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, プログラミング
-