Cakephp3であるシステムの開発を行っているのですが、下記の状況で困っています。
どなたか詳しい方いらっしゃいましたらアドバイスいただけませんでしょうか
▼概要
記事データを入れるAirticleテーブルと、各記事に対するコメントを入れるCommentsテーブルの2つのテーブルがhasManyで連結されています。
記事とコメントを一度に保存しようとしてまとめてnewEntityをすると、comments.article_idのrequirePresence に引っかかってしまいます。
▼詳細
記事データのテーブル
src/Model/Table/ArticlesTable.php
で下記のようにhasManyを設定しています。
$this->hasMany('Comments', [
'foreignKey' => ['article_id', 'comment_id' ],
]);
また、記事データのプライマリキーのarticle_id は AutoIncrement になっています。
このAirticleテーブルとhasManyの対象のCommentsテーブルを一度にデータを保存するために
記事データのコントローラー
src/Controller/ArticlesController.php
で下記のようにnewEntityを実行しています。
$article = $articleTable->newEntity(
$data,
['associated' => [
'Comments',
]]
);
ここで渡している $data は下記のような値です。
$data = array(
'title' => '記事タイトル',
'comments' => [
[
'comment' => 'コメント内容',
],
],
);
この時、newEntityの中でバリデーターが実行されると思うのですが、どうしてもCommentsのバリデーションに引っかかってしまいます。
引っかかるのは、下記のバリデーションです
src/Model/Table/CommentsTable.php
$validator->requirePresence('article_id', true, '入力してください')
data[comments][0] に article_id が入っていませんので、そのためにフィールド未定義のエラーが出ているものと思いますが、そもそもarticle_idは親articleが生成されないと定義されませんので、$dataの時点でこれを含めることは不可能です。
このバリデーションを取り除いて実行してみると、article保存後に生成されたarticle_idが自動的にセットされて保存されているのでバリデーションをなくせば問題なく動くこともわかっています。
しかしそれだと、直接CommentsテーブルだけをnewEntityする時に requirePresence のチェックが無しになってしまいますので、これは避けたいところです。
この状況を回避する手段は何かありますでしょうか。
私の方では下記のようなことを検討してみました
- 親テーブルに含まれる形でnewEntityされる時と単体でnewEntityされる時とで、バリデーションを変更することができないか
- validationでrequirePresenceするのをやめて、Rule でrequirePresence をするべきか
しかし、あまりスマートな手段に思えず、うまい解決方法をご存知の方いらっしゃいましたらお教えいただければ幸いです。
お手数ですがよろしくお願い致します。