CakePHP Code

cakephp5

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  ←これを追加している。

コメント

タイトルとURLをコピーしました