データの保存 ~リクエストデータからアソシエーションを保存する~
リクエストデータのエンティティへの変換
getData()で取得したリクエストデータをnewEntity()に渡し、エンティティに変換。
<?php $entity = $articles->newEntity($this->request->getData()); ?>
複数のエンティティを変換する場合、newEntities()を用いる。
<?php // リクエストデータ [ [ 'title' => '一番目の投稿', 'published' => 1 ], [ 'title' => '二番目の投稿', 'published' => 1 ], ]; $entity = $articles->newEntities($this->request->getData()); ?>
変換するアソシエーションを定義
リクエストデータに含まれているアソシエーションを保存する場合、associatedオプションでどのアソシエーションが変換されるべきか定義する必要がある。'associated' => ['モデル']で変換するアソシエーションを定義する。
<?php // Tags, Comments, Commentに紐付いたUsersも含めてエンティティに変換する $entity = $articles->newEntity($this->request->getData(), [ 'associated' => [ 'Tags', 'Comments' => ['associated' => ['Users']] // 入れ子になっている ] ]); // より簡潔な記法 $entity = $articles->newEntity($this->request->getData(), [ 'associated' => ['Tags', 'Comments.Users'] ]); ?>
リクエストデータの形式
belongsToMany
アソシエーションのデータを新規作成する場合
<?php $data = [ 'title' => '私のタイトル', 'body' => '本文', 'user_id' => 1, 'tags' => [ ['name' => 'CakePHP'], ['name' => 'インターネット'], ] ]; ?>
既存のアソシエーションと紐付ける場合
<?php $data = [ 'title' => '私のタイトル', 'body' => '本文', 'user_id' => 1, 'tags' => [ '_ids' => [1, 2, 3, 4] ] ]; ?>
新規と既存のレコードを両方関連付ける場合
<?php $data = [ 'title' => '私のタイトル', 'body' => '本文', 'user_id' => 1, 'tags' => [ ['name' => '新しいタグ'], ['name' => '別の新しいタグ'], ['id' => 5], ['id' => 21] ] ]; ?>
hasMany
アソシエーションを新規作成したり、それらのプロパティを更新する場合
<?php $data = [ 'title' => 'My Title', 'body' => 'The text', 'comments' => [ ['id' => 1, 'comment' => 'Update the first comment'], // 既に紐付いているアソシエーションのプロパティを更新 ['id' => 2, 'comment' => 'Update the second comment'], ['comment' => 'Create a new comment'], // アソシエーションを新規作成 ] ]; ?>
既存のレコードと紐付ける場合
<?php $data = [ 'title' => '私の新しい記事', 'body' => '本文', 'user_id' => 1, 'comments' => [ '_ids' => [1, 2, 3, 4] ] ]; ?>