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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

CakePHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

6271閲覧

CakePHP3でデータベースのレコードの加算、減算

mdemis_aco

総合スコア12

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

CakePHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2016/08/07 07:47

###前提・実現したいこと
cakephp3でデータベースに登録しているレコードの値 += 加算する値ということがやりたいのですが、
今の実装よりスマートな方法があればご教示頂きたく願います。

cakephpで実装した機能以外にも、データーベースを利用するシステムがあるため、
counterCacheの利用は避けたいです。

また、ORMのBehaviorを利用できるようなやり方があればと思います。

###今のコード

PHP

1$id = 1; 2$additionalNumber = 10; 3 4$connection = ConnectionManager::get('default'); 5$statement = $connection->prepare('update ExampleTable set eg_number = eg_number + :number where id = :id'); 6 7$statement->bindValue('number', $additionalNumber, 'integer'); 8$statement->bindValue('id', $id, 'integer'); 9 10$statement->execute();

皆様のお力添えいただきたく、よろしくお願いいたします。

###補足情報(言語/FW/ツール等のバージョンなど)
PHP: 7
CakePHP: 3.2
MariaDB: 10.1.14

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

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

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

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

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

guest

回答2

0

自己解決

色々と調べてみまして、スマートではなくなってしまいましたが、
Behaviorが有効になる方法がありましたので追記いたします。
for updateでトランザクション中レコードをロックし、元の値 += 加算する値を入れました。

他にアップデートする箇所もいちいちロックしないといけないですが・・・

PHP

1// use Cake\ORM\TableRegistry; 2// use Cake\Datasource\ConnectionManager; 3// use Exception; 4// している状態 5 6$id = 1; 7$additionalNumber = 10; 8 9$connection = ConnectionManager::get('default'); 10$connection->begin(); 11 12try 13{ 14 $exampleTable = TableRegistry::get('Item'); 15 $query = $exampleTable->find(); 16 17 $data = $query 18 ->where(['id' => $id]) 19 ->select(['id', 'eg_number']) 20 ->epilog('FOR UPDATE') 21 ->first(); 22 23 $data->eg_number = $data->eg_number + $additionalNumber; 24 25 $exampleTable->save($data); 26 $connection->commit(); 27} 28catch(Exception $e) 29{ 30 $connection->rollback(); 31}

実行時のSQLログ

SQL

1UPDATE 2 ExampleTable 3SET 4 eg_number = 11, // 元の値 += 10した値 5 modified = '2016-08-09 18:08:23', // TimestampBehaviorで追加された値 6WHERE 7 id = 1

投稿2016/08/09 09:28

mdemis_aco

総合スコア12

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

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

0

基本的にSQLで標準には+=演算子はサポートされていないと思いますので
例示の通りでよいかと思います。
どうしてもというのであれば別レコードでeg_numberの差分データを持ち
必要に応じてsumを取ればよいでしょうけど、毎回計算させるのは
無駄といえば無駄です。

投稿2016/08/08 00:37

yambejp

総合スコア116466

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

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

mdemis_aco

2016/08/09 09:32

差分データというのは考えが至りませんでした。ログも取る予定なのでそのほうが良いのか・・・・ 例のコードで良さそうということで、ちょっと自身が持てました。 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問