CakePHP 2.3で saveの便利な使い方・サンプルソース付き
2016/04/27
CakePHPで Save関数で保存する
CakePHPでレコードを更新する方法・概要
CakePHPは非常に便利で、主キーをもとにレコードを更新する場合は、下記の記述方法で簡単に処理できます。
1 |
$this->テーブル名->save($this->request->data) |
ただ、この処理では、入力された値をそのまま保存する処理になりますので、入力された値を何倍かにするとか、値と値を足して編集するとか、そんな保存方法を調べて見ましたので説明します。
上記の saveの処理を下記の記述方法に変更することで更新処理が行えるようになります。
1 2 3 |
$this->テーブル名->save( array ( 'id' => idの値 ), '更新するカラム' => 更新するの値 ) |
※2016.04.27 間違いを修正しました。
CakePHPでレコードを更新する方法・具体例
ここで説明するサンプルプログラムは、「CakePHP 2.3 主キー(ID)以外のキーで更新方法 updateAll」で説明したテーブルと、Controller、Model、Viewをもとに処理を追加して作成しています。
そのため、実際にサンプルプログラムを動かしてみようと思う方は、上記記事も併せて試してみてください。
また、ここで説明する処理は、主キー(ID)を指定して保存する処理になりますので、主キー(ID)以外のキーを条件に更新をしたい場合は上記の記事を参考にしてください。
今回も修正するファイルは、Controllerです。
/app/Controller/CommentsController.php
———————————
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function edit($id = null) { if (!$this->Comment->exists($id)) { throw new NotFoundException(__('Invalid comment')); } if ($this->request->is('post') || $this->request->is('put')) { if ($this->Comment->save($this->request->data)) { $this->Session->setFlash(__('The comment has been saved')); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The comment could not be saved. Please, try again.')); } } else { $options = array('conditions' => array('Comment.' . $this->Comment->primaryKey => $id)); $this->request->data = $this->Comment->find('first', $options); } } |
———————————
上記が Bakeで作成される「edit」関数の部分です。
その部分をコピーして作成したものが下記の edit3の関数です。
上記の 6行目を 6行目~8行目に変更しています。
今回も、変更する部分はここだけです。
/app/Controller/CommentsController.php
———————————
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public function edit3($id = null) { if (!$this->Comment->exists($id)) { throw new NotFoundException(__('Invalid comment')); } if ($this->request->is('post') || $this->request->is('put')) { $save_array = array ( 'id' => $this->request->data['Comment']['id'], 'post_id' => $this->request->data['Comment']['post_id'] ); if ($this->Comment->save($save_array)) { $this->Session->setFlash(__('The comment has been saved')); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The comment could not be saved. Please, try again.')); } } else { $options = array('conditions' => array('Comment.' . $this->Comment->primaryKey => $id)); $this->request->data = $this->Comment->find('first', $options); } } |
———————————
この saveの関数は、主キーである IDを指定することで更新処理を行います。
そのため、上記の 6行目の様に「’id’ => $this->request->data[‘Comment’][‘id’]」を指定することでその IDのレコードの情報を更新します。
もともとこの記事は、主キー(ID)以外のキーで更新することを確認するために書き始めた記事ということもあって、6行目、7行目を下記の様に 1つ目の項目を主キー(ID)以外のものを設定すると、もしかするとその項目をキーに値の更新ができるんじゃないか、と淡い期待を抱いてみましたが、違う動きになりました。
Save関数は、主キー(ID)が指定されている場合は、そのキーの値を UPDATE処理を行い、主キーがない場合は、INSERT処理を行う仕様になっていますので、IDを指定しないと単なる Insertになりました。
———————————
1 2 |
$save_array = array ( 'post_id' => $this->request->data['Comment']['post_id'], 'sec_code' => $this->request->data['Comment']['sec_code'] ); |
———————————
ちなみに、IDは配列の中に指定してあれば問題なく、順番は特に指定はないようです。
そのため、下記の様に IDが最後でも何の問題もなく 更新処理が行われます。
———————————
1 2 |
$save_array = array ( 'post_id' => $this->request->data['Comment']['post_id'], 'id' => $this->request->data['Comment']['id'] ); |
———————————
また、下記の様に更新する項目を複数指定すれば指定しただけの項目を更新することができまs。
———————————
1 2 3 |
$save_array = array ( 'id' => $this->request->data['Comment']['id'], 'post_id' => $this->request->data['Comment']['post_id'], 'sec_code' => $this->request->data['Comment']['sec_code'] ); |
———————————
また、post_idの値を 5倍にして保存するような場合は、下記の様に値を編集することで処理できます。
———————————
1 2 3 |
$save_array = array ( 'id' => $this->request->data['Comment']['id'], 'post_id' => $this->request->data['Comment']['post_id'] * 5, 'sec_code' => $this->request->data['Comment']['sec_code'] ); |
———————————
また、listのような varcharの項目ですが、updateAllであったような不具合はありませんでしたので、下記の様にシングルクォートで囲む必要はありません。
逆に、Save関数の場合は、シングルクォートで囲むとシングルクォートが付いたまま保存されますので注意が必要です。
———————————
1 2 3 |
$save_array = array ( 'id' => $this->request->data['Comment']['id'], 'post_id' => $this->request->data['Comment']['post_id'], 'list' => "'" . $this->request->data['Comment']['list'] . "'" ); |
———————————
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、CakePHP5でクリエビルダーを利用してテーブルからレコードを取得する際、asを使用してカラムの別名で値を取得したい場合の対応方法を解説。また、別名にはハイフンやアスタリスクなど使用できない文字がある点も解説。
-
-
CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説
CakePHP4のエラーメッセージ、完了メッセージなどを表示するフラッシュ処理の解説。Controller、レイアウトファイル、テンプレートファイルでそれぞれ処理を指定する。
-
-
CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1
CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその1で基本的な導入方法の解説で読みながら簡単に導入が可能。
-
-
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。
-
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
-
CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。
-
-
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。
-
-
CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
-
CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可
CakePHP3のユーザ管理、ログイン認証プラグインである「CakeDC/Users」のメッセージを日本語にする手順の解説とともに、日本語の翻訳ファイルを提供。ファイルを設置すれば日本語になる!
-
-
CakePHP4、5で$_SERVERと同じようにURIを取得する「getUri()」の紹介
PHPでサーバ情報、環境情報を取得する際は「
$_SERVER
」を利用するが、似たような情報をCakePHPの関数で取得する際は「getUri()
」を使用する。取得出来る値は一致するものもあるが、違うものもあり便利な使い方もある。
Comment
以下についてですが,
$this->テーブル名->save(
array ( ‘id’ => idの値 ),
array ( ‘更新するカラム’ => 更新するの値 ) )
正しくは,
$this->テーブル名->save(
array (
‘id’ => idの値,
‘更新するカラム’ => 更新するの値
)
)
siraさん、コメントありがとうございます。
ご指摘の件、間違っていましたね。
確認させていただき、本文の方も修正させていただきました。ありがとうございます!
他にも間違いがあるかもしれませんが...