質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1093閲覧

updateAllで複数のテーブルを効率的に短いコードで更新かけたい。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2020/10/23 08:15

編集2020/10/28 04:51

$this->テーブル名->updateAllが複数になるのが辛いです。仕方のないことでしょうか?

function使ってモデル

Testモデル public function outputName($name){ $this->updateAll([ "Test.atai",100], [ "Test.id",Test.id], ]) }
CakePHP $name = findをかく; $this->Test->outputName($name);

書いてみましたがうまくいかず、functionでupdateAllを書こうとしたらどうなりますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nojimage

2020/10/23 09:12

テーブルごとに更新する値、更新する条件が変わるものですか? また、どのような目的で複数テーブルへの更新が必要になっているのか書いてもらうと別の方法が提示できるかもしれません。
退会済みユーザー

退会済みユーザー

2020/10/27 08:21

joinとか使えたりしますか?!
guest

回答1

0

ベストアンサー

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

投稿2020/10/28 00:21

nojimage

総合スコア959

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/10/28 09:41 編集

コードをみて感動しました。ありがとうございます...!!!! 何も難しいことはないんですが、おもいつかなかったのでとても嬉しいです!ありがとう!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問