エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP 2.3で saveの便利な使い方・サンプルソース付き

      2016/04/27

CakePHPで Save関数で保存する

 

CakePHPでレコードを更新する方法・概要

 
CakePHPは非常に便利で、主キーをもとにレコードを更新する場合は、下記の記述方法で簡単に処理できます。

$this->テーブル名->save($this->request->data)

 
ただ、この処理では、入力された値をそのまま保存する処理になりますので、入力された値を何倍かにするとか、値と値を足して編集するとか、そんな保存方法を調べて見ましたので説明します。
 
上記の saveの処理を下記の記述方法に変更することで更新処理が行えるようになります。
 

$this->テーブル名->save(
       array ( 'id' => idの値 ),
               '更新するカラム'   => 更新するの値 )

※2016.04.27 間違いを修正しました。
 
 


 

CakePHPでレコードを更新する方法・具体例

 
ここで説明するサンプルプログラムは、「CakePHP 2.3 主キー(ID)以外のキーで更新方法 updateAll」で説明したテーブルと、Controller、Model、Viewをもとに処理を追加して作成しています。
 
そのため、実際にサンプルプログラムを動かしてみようと思う方は、上記記事も併せて試してみてください。
 
また、ここで説明する処理は、主キー(ID)を指定して保存する処理になりますので、主キー(ID)以外のキーを条件に更新をしたい場合は上記の記事を参考にしてください。
 
 
今回も修正するファイルは、Controllerです。
 
/app/Controller/CommentsController.php
———————————

  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
———————————

  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になりました。
 
———————————

      $save_array = array ( 'post_id'  => $this->request->data['Comment']['post_id'], 
                            'sec_code' => $this->request->data['Comment']['sec_code'] );

———————————
 
ちなみに、IDは配列の中に指定してあれば問題なく、順番は特に指定はないようです。
そのため、下記の様に IDが最後でも何の問題もなく 更新処理が行われます。
 
———————————

      $save_array = array ( 'post_id' => $this->request->data['Comment']['post_id'], 
                            'id'      => $this->request->data['Comment']['id'] );

———————————
 
また、下記の様に更新する項目を複数指定すれば指定しただけの項目を更新することができまs。
 
———————————

      $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倍にして保存するような場合は、下記の様に値を編集することで処理できます。
 
———————————

      $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関数の場合は、シングルクォートで囲むとシングルクォートが付いたまま保存されますので注意が必要です。
 
———————————

      $save_array = array ( 'id'      => $this->request->data['Comment']['id'],
                            'post_id'  => $this->request->data['Comment']['post_id'], 
                            'list' => "'" . $this->request->data['Comment']['list'] . "'" );

———————————

 - CakePHP 3.x 4.x 5.x

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Comment

  1. sira より:

    以下についてですが,

    $this->テーブル名->save(
    array ( ‘id’ => idの値 ),
    array ( ‘更新するカラム’ => 更新するの値 ) )

    正しくは,

    $this->テーブル名->save(
    array (
    ‘id’ => idの値,
    ‘更新するカラム’ => 更新するの値
    )
    )

    • エス技研 より:

      siraさん、コメントありがとうございます。
      ご指摘の件、間違っていましたね。
      確認させていただき、本文の方も修正させていただきました。ありがとうございます!
      他にも間違いがあるかもしれませんが...

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。

CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法

CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングをする方法を解説。インストール方法、読み込み方法。および、具体的なスクレイピングを実行するサンプルソースも。

CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説
CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説

CakePHP4で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定しそれを読み込み判別する。

CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力する方法

CakePHP3でPHPExcelを利用してエクセルを編集、出力するサンプルソース+解説。PHPExcelのインストール方法の解説からファイル保存とダウンロードの方法なども解説。

CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数
CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数

CakePHP3で特定フォルダのパスの定数を解説。root、DocumentRoot、app、config、webroot、tests、tmp、cache、vendor、コア、コアの srcが設定済み。realpath()関数を使うと柔軟なパス指定が可能。

CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用
CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用

CakePHP3にプラグイン「friendsofcake/bootstrap-ui」、デザインテンプレート「Bootstrap」を設置する手順を解説。Bootstrapの簡単な使い方やデフォルトのデザインとの混在方法なども解説。

CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3
CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその3で記事を更新する際のファイルの取り回しなどについてを解説。

CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説

CakePHP3でOGPを設定する方法を解説。fetch、assignを使用しレイアウトファイルに編集した変数にテンプレートファイルから値を指定する。これを利用してOGPを編集する。

CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法

アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。

Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法

CakePHP4のコマンド(シェル)に対して、環境変数を指定して実行する方法を解説。LinuxとWindows上のXAMPPとでは記述方法が異なるため、Windowsのsetコマンドについても詳細解説。


Warning: Trying to access array offset on null in /home/ss-giken/s-giken.net/public_html/blog/wp-content/plugins/amazonjs/amazonjs.php on line 637