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

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

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

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

3回答

10516閲覧

SQLSTATE[HY000]: General error: 1364 Field '〇〇' doesn't have a default value の解決方法

Yoshiaki_Miyata

総合スコア3

MySQL

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2021/12/14 07:49

編集2021/12/14 22:56

PHP Laravel

roomテーブルとmessageテーブルがあり、room hasMany messageの関係です。

以下のフォームでメッセージを送信すると下記のエラーが出てしまします。

●フォーム

<input type="hidden" name="send_by" value="company"> <input type="hidden" name="room_id" value="{{$room->id}}"> <input type="text" name="text"> <input type="submit" value="送信">

●エラー分
SQLSTATE[HY000]: General error: 1364 Field 'room_id' doesn't have a default value (SQL: insert into messages (text, updated_at, created_at) values (テスト, 2021-12-14 07:41:31, 2021-12-14 07:41:31))

誤字や、変数の設定などはミスがないと思いますが、どこが原因なのか教えていただけますでしょうか? value="{{$room->id}}"をvalue="1"のように置き換えても同じエラーが出ました。

以下メッセージテーブルの内容になります。

public function up() { Schema::create('messages', function (Blueprint $table) { $table->id(); $table->integer('room_id'); $table->string('send_by'); $table->string('text'); $table->timestamps(); }); }

Messageテーブルの構造になります。

イメージ説明

Messageコントローラー

class MessageController extends Controller { public function CompanyMessageStore(Request $request) { $user = Auth::user(); $message = new Message(); $message->text = $request->text(); $message->save(); return back(); } }
Messageモデル <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Message extends Model { use HasFactory; public function room() { return $this->belongsTo('App\Models\Room'); } }

Roomモデル

public function messages() { return $this->hasMany('App\Models\Message'); }

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

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

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

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

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

skys215

2021/12/14 15:09

データを保存するコードとmodelファイルのコードをお願いします。
Yoshiaki_Miyata

2021/12/14 22:52 編集

失礼いたしました。 以下になります。 --------------------------------------- コントローラー public function CompanyMessageStore(Request $request) { $user = Auth::user(); $message = new Message(); $message->text = $request->text(); $message->save(); return back(); } ------------------------- Messageモデル <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Message extends Model { use HasFactory; public function room() { return $this->belongsTo('App\Models\Room'); } } ------------------------- Roomモデル public function messages() { return $this->hasMany('App\Models\Message'); }
guest

回答3

0

ベストアンサー

主題以外にもミスがあるのでまとめて指摘します。

messages.room_id の外部キー制約

php

1public function up() 2{ 3 Schema::create('messages', function (Blueprint $table) { 4 $table->id(); 5 $table->integer('room_id')->constrained(); // ←これを追加 6 $table->string('send_by'); 7 $table->string('text'); 8 $table->timestamps(); 9 }); 10}

こうしておくと,存在する rooms.id 以外は messages.room_id にインサートできなくなるので,制約事項として妥当になります。

messages.text の NOT NULL 制約

最初 $table->string('text') の部分を $table->string('text')->nullable() にしていませんでしたか?画像を見る限り,デフォルト値が NULL で NULL 許容になっているので,php artisan migrate:fresh を実行するなどして作り直してください。

$request->text() メソッドは存在しない

$request->text の間違いです。但し,以下のような問題点がありますので,代わりに $request->input('text') を使用することを個人的には推奨しています。

php

1class MessageController extends Controller 2{ 3 // 蛇足: できればメソッド名は companyMessageStore のように小文字で始まるほうが望ましい 4 public function companyMessageStore(Request $request) 5 { 6 $user = Auth::user(); 7 8 $message = new Message(); 9 $message->text = $request->input('text'); // ←ここを修正 10 $message->save(); 11 12 return back(); 13 } 14}

本題: room_id のセット

フォームから送信された room_id が使われていないので,コントローラで作成するモデルにセットするコードを書いてください。

php

1class MessageController extends Controller 2{ 3 public function companyMessageStore(Request $request) 4 { 5 $user = Auth::user(); 6 7 $message = new Message(); 8 $message->room_id = $request->input('room_id'); // ←これを追加 9 $message->text = $request->input('text'); 10 $message->save(); 11 12 return back(); 13 } 14}

但し, BelongsTo の外部キーに関してはリレーションを使ってセットするほうがお作法としてはきれいです。

php

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Factories\HasFactory; 6use Illuminate\Database\Eloquent\Model; 7 8class Message extends Model 9{ 10 use HasFactory; 11 12 public function room() 13 { 14 return $this->belongsTo(Room::class); // ←蛇足: https://www.php.net/manual/ja/language.oop5.basic.php#language.oop5.basic.class.class 15 } 16}

php

1class MessageController extends Controller 2{ 3 public function companyMessageStore(Request $request) 4 { 5 $user = Auth::user(); 6 7 $message = new Message(); 8 $message->room()->associate($request->input('room_id')); // ←変更 9 $message->text = $request->input('text'); 10 $message->save(); 11 12 return back(); 13 } 14}

個人的にはほぼこれで理想形と感じる形です。あとは $request のバリデーションも含められれば,十分実用的なコードになると思います。

投稿2021/12/15 01:14

mpyw

総合スコア5223

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

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

Yoshiaki_Miyata

2021/12/19 08:31

ご回答いただきありがとうございました。 質問以外でも適切でない箇所が複数ありましたので、そちらへのアドバイスもありがとうございます。 いただいた内容で試したところ、無事に正しく動きました。今後も同じ開発の際に活かしていきます。
guest

0

room_idはNOT NULLの為、必須になっております。
メッセージを挿入時点ではroom_idが指定してないのでこのエラーが出ました。

解決策1:
room_idは必須であれば、挿入の時にroom_idを指定する。

PHP

1public function CompanyMessageStore(Request $request){ 2... 3$member_id = 123456789;//<-- 4$message->member_id = $member_id; //<-- 5$message->text = $request->text();

解決策2:
room_idは無くてもいいなら、マイグレーションを使ってroom_idをnullable(true)にする。

投稿2021/12/15 00:47

skys215

総合スコア910

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

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

Yoshiaki_Miyata

2021/12/15 01:08

回答ありがとうございます! room_idは必須なので、解決策1で考えております。 重ねてご質問失礼いたします。 >room_idは必須であれば、挿入の時にroom_idを指定する。 とありますが、メッセージフォームに <input type="hidden" name="room_id" value="{{$room->id}}"> と「hidden」を指定すれば、勝手に挿入されると考えていたのですが、そうではなくて、 input type="hidden"はあ、あくまでも、こちらから入力をしなくてもコントローラーに渡すという意味で、コントローラーに渡ったとは、こちらで$room_idを指定する必要があるということでしょうか? お手数ですがご確認お願い致します。
skys215

2021/12/15 05:41

はい、ただコントローラーに渡すだけです。 もしも指定必要なくてもいいならば、$message->text = $request->text();は書かなくてもいいじゃないでしょうか。 コントローラーは渡してきたデータはどう使うかはわかりませんので、指定する必要があります。 ただ、$request->all()と組み合わせば一個一個指定しなくても済む方法はあります。 https://readouble.com/laravel/8.x/ja/eloquent.html の「複数代入」に書いてあります。
guest

0

質問にmessagesのCREATE TABLE文を追記してください。

SQL

1insert into messages (text, updated_at, created_at) values (テスト, 2021-12-14 07:41:31, 2021-12-14 07:41:31) 23insert into messages (text, updated_at, created_at) values ('テスト', '2021-12-14 07:41:31', '2021-12-14 07:41:31')

SQLの掟として文字列はシングルクォートで囲まなければなりません。
DATETIME型も同様。参考 MySQL 日付型と時刻型(DATE, TIME, DATETIME, TIMESTAMP, YEAR)

投稿2021/12/14 21:23

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問