
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 するだけでよいかと思います。
※事前にアソシエートの定義は各テーブル内で事前に必要です。