前提・実現したいこと
現在、スマートフォン向けのアプリを作成中です。
webのリクエストからDB内のデータを変更するプログラムを作成しています。
Laravelのコントローラ内の処理で、
テーブルからレコードを取得し、
その中の値を変更するプログラムを記述しました。
しかし、挙動が望ましくありません。
発生している問題・エラーメッセージ
・求めている結果
取得した1レコードのみ更新
・実際の結果
user_idに紐づいたstatusカラムの全ての値が
変更されている。
1.
ドキュメントによると、save()という挙動が、
「モデルの更新をする」という説明になっています。
https://readouble.com/laravel/6.x/ja/eloquent.html
私の考えの
取得したレコードを変数として与え、
その「1レコード部分の更新」という使い方は
できないものなのでしょうか。
2.
この1レコードを更新することを実現するには、
どのようなアプローチをすればよろしいでしょうか。
参考文献や、
知見がありましたら、
ご教授いただけますと幸いです。
よろしくお願いいたします。
該当のソースコード
---ソース(コントローラ)---
PHP
1public function Foo(Request $request){ 2 3 $user_id = $request->user_id; 4 $quest_id = $request->quest_id; 5 6 //user_questからクエスト取得 7 $user_quest = UserQuest::where('user_id', $user_id)->where('quest_id', $quest_id)->first(); 8 if (!$user_quest){ 9 return config('error.ERROR_INVALID_DATA'); 10 } 11 12 //値の変更 13 $user_quest->status = 3; 14 15 //DBの更新 16 try{ 17 $user_quest->save(); 18 } catch (\PDOException $e){ 19 return config('error.ERROR_DB_UPDATE'); 20 } 21 22 ~~ 23}
---モデル---------
PHP
1class UserQuest extends Model 2{ 3 // 4 protected $table = 'user_quest'; 5 public $incrementing = false; 6 protected $primaryKey = 'user_id'; //複数未対応 7 public $timestamps = false; 8}
---マイグレーション---
PHP
1 public function up() 2 { 3 Schema::create('user_quest', function (Blueprint $table) { 4 $table->string('user_id', 37)->charset('utf8'); 5 $table->unsignedInteger('quest_id')->default(0); 6 $table->unsignedTinyInteger('status')->default(0); 7 $table->boolean('clear')->default(0); 8 $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); 9 $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP')); 10 $table->primary(array('user_id', 'quest_id')); 11 12 }); 13 }
試したこと
ドキュメントやブログを参考に
saveやupdateの挙動などを調べました。
問題を解決する根本の原因が特定できておりません。
補足情報(FW/ツールのバージョンなど)
####各種バージョン
・PHP
7.2.27
・Laravel
6.16.0
・MySQL
5.7.29
####参考書籍
「スタートアップ・個人で作れるスマホ向け Unityソーシャルゲーム開発ガイド」
https://www.shuwasystem.co.jp/book/9784798059389.html
###全体の処理の流れや、構成について
処理の流れは、
下記のようになっています。
①user側のテーブルからユーザidを取得し、
クライアント側に保持
(user_profileテーブル)後述
②取得したユーザidにクエストidの情報をつけて
quest(ユーザ側)のテーブルを更新 ←今回ご質問していた箇所
(user_questテーブル)
③quest(マスターデータ)側はJSONで取得し、
クライアント側で保持
(特に上記のサーバ側の箇所に干渉しない)
◆user側
利用するユーザ情報を定義しています。
・ユーザid
・ユーザ名
quest(ユーザ)側の「user_quest」テーブルと共通するユーザid(user_id)のカラムを持っていますが、
現状、サーバー側で「user_profile」テーブルと、「user_quest」テーブルを複合して
参照する処理はまだ追加していません。
テーブル名:user_profile
〇user_profileテーブル
---------マイグレーション----------
Schema::create('user_profile', function (Blueprint $table) {
$table->string('user_id',37)->charset('utf8');
$table->string('user_name',32)->charset('utf8');
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
});
◆quest(ユーザ)側
ユーザが持つ変動的なゲーム情報を定義しています。
・クエストクリア(未or済)
・クエスト状態(スタート、リタイア、クリア) など
テーブル名:user_quest
(↑今回ご質問したテーブル)
〇user_questテーブル
---------マイグレーション----------
Schema::create('user_quest', function (Blueprint $table) {
$table->string('user_id', 37)->charset('utf8');
$table->unsignedInteger('quest_id')->default(0);
$table->unsignedTinyInteger('status')->default(0);
$table->boolean('clear')->default(0);
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
$table->primary(array('user_id', 'quest_id'));
});
◆quest(マスターデータ)側
固定的なゲーム情報を定義しています。
(クエスト情報)
こちらはJSON形式で別に管理しています。
quest側の構成
・クエストid
・クエスト名 など
回答1件
あなたの回答
tips
プレビュー