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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1816閲覧

laravelで受け取ったJsonをデータベースに保存するには

lkjgffh

総合スコア37

MySQL

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/01/04 06:37

###前提・実現したいこと
外部アプリケーションから送られてきたJsonをLaravelで受け取って、それをMysqlに登録する
###発生している問題・エラーメッセージ

{ "message": "SQLSTATE[HY000]: General error: 1364 Field 'user_name' doesn't have a default value (SQL: insert into `users` (`account_code`) values (account_code))", "exception":

###該当のソースコード

public function userRegistration(Request $request){ $request->all(); dump($request->all()); DB::table('users')->insert( ['account_code' => 'account_code'], ['user_name' => 'user_name'] ); }

###送られてきているJson
dump($request->all());で見た結果一部割愛していますが、Jsonそのものは取得できていると思います

"account_code" => "19384724937" "user_id" => "4" "user_name" => "テストユーザー"

###試したこと
課題に対してアプローチしたことを記載してください
doesn't have a default value というのは、データベースのSQLモードに”STRICT_TRANS_TABLES”が追加されているため起こるそうなので

下記のようになっていたものを
mysql> SHOW GLOBAL VARIABLES LIKE 'sql_mode';
+---------------+---------------------------------------------------------------
| Variable_name | Value
+---------------+---------------------------------------------------------------
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO
+---------------+---------------------------------------------------------------
1 row in set (0.01 sec)

このように変更しました
mysql> SET GLOBAL sql_mode=NO_ENGINE_SUBSTITUTION;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'sql_mode';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| sql_mode | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+

しかし結果は変わらずです。
原因はSQLモードに”STRICT_TRANS_TABLES”が設定されているからというわけではないのでしょうか?
問題点としてどのようなことが考えられますか?

###補足情報(言語/FW/ツール等のバージョンなど)
Laravel5.5
Mysqlバージョン 5.7.20-0ubuntu0.16.04.1
環境
Vagrant Homestead

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

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

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

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

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

guest

回答1

0

ベストアンサー

あなたのコードの以下の箇所ですが、

PHP

1 DB::table('users')->insert( 2 ['account_code' => 'account_code'], 3 ['user_name' => 'user_name'] 4 );

まずinsertに渡すデータは「1件のレコードが1個の連想配列」になっていなければならず、これでは「account_codeだけを持ったデータ、user_nameだけを持ったデータそれぞれ1件ずつ」というinsertになります。そして、'user_name' doesn't have a default valueというエラーは「user_nameにはデフォルト値が無いです」という意味であり、前者の「account_codeだけを持つデータ」にuser_nameが無いためエラーとなっています。さらに、送られてきたjsonからデータを取るのであれば、$requestからデータを取り出さなければ意味がありません。よって以下のコードが正しい動作をすると思います。

PHP

1 DB::table('users')->insert( 2 ['account_code' => $request->input('account_code'), 3 'user_name' => $request->input('user_name')] 4 );

投稿2018/01/04 07:16

masaya_ohashi

総合スコア9206

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

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

lkjgffh

2018/01/04 07:47 編集

「account_codeだけを持つデータ」にuser_nameが無いため なるほど!そういうことだったんですね。意味が分かりすっきりしました。ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問