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