Cakephp4 にて、アソシエーションも含めて保存しつつ、そのアソシエート先に更に関連モデルが紐づいている場合、それも含めて検証(バリデート)、保存する方法です。
save前の期待されるリクエストデータ構造
// 例えば、以下のようにtimetablesフィールドに複数レコードを保存できる仮定とする [ 'timetables' => [ (int) 0 => [ 'mon_start' => '9:00', 'mon_end' => '10:00', 'timetable_available' => [ 'mon_type' => '1', ], ], ], 'id' => '141218', ]
たとえば、timetables
フィールドには 0
キーから始まり、複数レコードを保存するパターンを記しています。かつ、timetables
テーブルキーの配下に timetable_available
テーブルキーがさらに紐づいているアソシエート先、ということにしておきます。
アソシエートも関連付けて検証し、エンティティ生成
$entity = $this->Hoges->newEntity($data, [ 'associated' => [ 'HospitalTimetables' => [ 'associated' => ['HospitalTimetableAvailables'], ], ], ]);
newEntity
時のオプションとして associated
を利用します。アソシエーション先を定義すると共に、さらに紐づく関連モデルがある場合、同じように associated
で紐づけることが可能になります。
あとは、エンティティ生成時にバリデートが走る仕組みなので、以下のような形で保存コードを書けばよいと思います。
アソシエーション先も含めて保存
if ($entity->hasErrors()) { // エラーが存在した場合の処理 } // アソシエーション含め保存される $this->Hoges->save($entity);
エンティティ生成時にアソシエート関連を明記しておけば、あとは save
するだけでよいかと思います。
※事前にアソシエートの定義は各テーブル内で事前に必要です。