CakePHP3で連携するテーブルのデータを保存する方法

CakePHPではテーブルのカラム名をいい感じに指定すると、外部キーを指定しなくても勝手にリレーションしてくれます。

Formのname指定をいい感じに指定してあげると、簡単なsaveメソッドで、関連するテーブルにも勝手にデータを保存してくれます。

$this->Form->create($article);

// Article 入力
echo $this->Form->control('title');

// Author 入力 (belongsTo)
echo $this->Form->control('author.id');
echo $this->Form->control('author.first_name');
echo $this->Form->control('author.last_name');

// Author の profile (belongsTo + hasOne)
echo $this->Form->control('author.profile.id');
echo $this->Form->control('author.profile.username');

// Tags 入力 (belongsToMany)
echo $this->Form->control('tags.0.id');
echo $this->Form->control('tags.0.name');
echo $this->Form->control('tags.1.id');
echo $this->Form->control('tags.1.name');

// belongsToMany の複数選択要素
echo $this->Form->control('tags._ids', [
    'type' => 'select',
    'multiple' => true,
    'options' => $tagList,
]);

// 結合テーブルの入力 (articles_tags)
echo $this->Form->control('tags.0._joinData.starred');
echo $this->Form->control('tags.1._joinData.starred');

// Comments 入力 (hasMany)
echo $this->Form->control('comments.0.id');
echo $this->Form->control('comments.0.comment');
echo $this->Form->control('comments.1.id');
echo $this->Form->control('comments.1.comment');

https://book.cakephp.org/3.0/ja/views/helpers/form.html#associated-form-inputs

$this->request->getData()が以下のような感じの形になれば保存されるようになります。

$data = [
    'first_name' => 'Sally',
    'last_name' => 'Parker',
    'courses' => [
        [
            'id' => 10,
            '_joinData' => [
                'grade' => 80.12,
                'days_attended' => 30
            ]
        ],
        // 他のコース
    ]
];
$student = $this->Students->newEntity($data, [
    'associated' => ['Courses._joinData']
]);

https://book.cakephp.org/3.0/ja/orm/saving-data.html#id20