CakePHP5を使用してプログラミングしている中で書き留めたメモです。
Model
hasManyの保存
例えば、ArticlesテーブルとCommentsテーブルが1対多の関係にあるとします。この時、Articles.idとComments.article_idで関連付けされます。
1つの記事と関連する複数のコメントを保存する場合、以下の方法でテーブルへ追加できます。
// コントローラーに記述
$data = [
'name' => '一番目の投稿',
'status' => 1,
'comments' => [
['body' => 'これまでで最高の投稿', 'status' => 1],
['body' => '私は実にこれが好きだ。', 'status' => 1]
]
];
$articles = TableRegistry::getTableLocator()->get('Articles');
$article = $articles->newEntity($data, [
'associated' => ['Comments']
]);
$articles->save($article);
この時、Comments.article_idは自動で設定されます。
Articlesテーブルのデータと関連するCommentsテーブルのデータを同時に更新する場合は、以下の様にするとできます。ここではArticlesテーブルのデータと関連するCommentsテーブルのstatusを0にするものとします。
$articlesEntity = $this->Articles->find()->contain(['Comments'])
->where(['Articles.id' => 1])->first();
$articlesEntity->status = 0;
foreach ($articlesEntity->comments as $commment) {
$commment->status = 0,
}
$recordEntity->setDirty('comments', true);
$this->Articles->save($articlesEntity, ['associated' => ['Comments']]);
$articlesEntityの_fieldsの中に関連テーブルの情報(この場合はcomments)として配列でCommentsの該当レコード情報を持っており、setDirtyでcommentsに更新があることを設定しています。
このような感じです。
$articlesEntity
_fields
[id]
[name]
[status] ← 1を0へ
[comments] ←この中に更新があることを示すために...
[0]
_fields
[body]
[status] ← 1を0へ
[1]
_fields
[body]
[status] ← 1を0へ
_dirty
[comments] = true ←これを追加している。
コメント