Cakephp PHP WEB開発

【Cakephp4】アソシエート先に関連モデルが紐づいている場合の保存方法

※本サイトはPR表記を含みます。

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 するだけでよいかと思います。

事前にアソシエートの定義は各テーブル内で事前に必要です。

-Cakephp, PHP, WEB開発
-