データの保存 ~リクエストデータからアソシエーションを保存する~

リクエストデータのエンティティへの変換

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]
    ]
];
?>