CakePHP のクエリは一文づつしか発行できませんので、基本的にはUPDATE対象のテーブル分updateAllを呼び出す必要があります。
updateAllの条件を配列形式で定義して
php
1// モデルのメソッド内で記述した場合
2$db = $this->getDataSource();
3
4$updates = [
5 'ModelA' => [
6 'values' => [
7 // updateAllでは値を適切にクオートして与える必要があります
8 'ModelA.field_a' => $db->value('valueA'),
9 'ModelA.field_b' => $db->value('valueB'),
10 ],
11 'conditions' => ['ModelA.field_c' => 'valueC'],
12 ],
13 'ModelB' => [
14 'values' => [
15 'ModelB.field_d' => 'ModelB.field_e',
16 'ModelB.field_f' => $db->value('valueF'),
17 ],
18 'conditions' => ['ModelB.field_g' => 'valueG'],
19 ],
20];
21
22foreach ($updates as $modelName => $opt) {
23 $model = ClassRegistry::init($modelName);
24 $model->updateAll($opt['values'], $opt['conditions']);
25}
といった感じでしょうか。
トランザクションを挟むのであれば、foreachの前後に入れればいいでしょう。
php
1// モデルのメソッド内で記述した場合
2$db = $this->getDataSource();
3
4$db->begin();
5try {
6 foreach ($updates as $modelName => $opt) {
7 $model = ClassRegistry::init($modelName);
8 if (!$model->updateAll($opt['values'], $opt['conditions'])) {
9 throw new \RuntimeException(sprintf('%s の更新に失敗しました', $modelName));
10 }
11 }
12 $db->commit();
13} catch (Exception $e) {
14 $db->rollback();
15 // その他のエラー処理
16}
updateAllは値のクオート処理やエスケープ処理をしてくれないので利用には注意してください。
updateAllを使用するのは一時的な管理のためのバッチ処理などに留め、安易に使わない方がよいメソッドと考えています。
挙動を把握したうえで利用するのであれば問題ありません。
Model::updateAll - データを保存する - 2.x