🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

PHP

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

Laravel 5

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

Q&A

解決済

2回答

6526閲覧

SQLSTATE[HY000]: General error: 1364 Field ◯◯doesn't have a default valueが出てしまう

m2B

総合スコア20

MySQL

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

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2019/11/19 12:49

編集2019/11/19 14:43

Laravelでtodoリストを作っています。
メインタスクとそれに紐づくサブタスクを作っています。

サブタスクを作成ー>保存するときにエラーが出ます。

SQLSTATE[HY000]: General error: 1364 Field 'main_task_id' doesn't have a default value (SQL: insert into `tasks` (`title`, `due_date`, `updated_at`, `created_at`) values (ランニング, 2019/11/20, 2019-11-19 12:18:24, 2019-11-19 12:18:24))

コントローラーが

### TaskController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\MainTask; use App\Http\Requests\CreateTask; use App\Task; class taskController extends Controller { public function showCreateForm(int $id) { return view ('tasks/create', [ 'maintask_id' => $id ]); } public function create(int $id, CreateTask $request) { $current_maintask = MainTask::find($id); // dd($current_maintask); $task = Task::create([ 'title' => $request->title, 'due_date' => $request->due_date ]); // $task = new Task(); // $task->title = $request->title; // $task->due_date = $request->due_date; $current_maintask->tasks()->save($task); return redirect()->route('maintasks.index', [ 'id' => $current_maintask->id ]); } public function showEditForm(int $id, int $task_id) { $task = Task::find($task_id); return view('tasks/edit', [ 'task' => $task, ]); } public function edit(int $id, int $task_id, EditTask $request) { $task = Task::find($task_id); $task->title = $request->title; $task->status = $request->status; $task->due_date = $request->due_date; $task->save(); return redirect()->route('tasks.index', [ 'id' => $task->maintask_id, ]); } }

モデルが

### Task.php <?php namespace App; use Illuminate\Database\Eloquent\Model; class Task extends Model { protected $fillable = ['main_task_id','title', 'due_date']; protected $table = "tasks"; public function maintasks() { return $this->belongsTo('App\MainTask'); } // protected $attributes = [ // "main_task_id" => "(default value)", // ]; /** * 状態定義 */ const STATUS = [ 1 => ['label' => '未着手'], 2 => ['label' => '着手中'], 3 => ['label' => '完了'], ]; /** * 状態のラベル * @return string */ public function getStatusLabelAttribute() { // 状態値 $status = $this->attributes['status']; // 定義されていなければ空文字を返す if (!isset(self::STATUS[$status])) { return ''; } return self::STATUS[$status]['label']; } }

特にサブタスクのコントローラーのcreateメソッドを見てほしいのですが

// $task = new Task(); // $task->title = $request->title; // $task->due_date = $request->due_date;

の処理だとうまく保存できるのですが、

$task = Task::create([ 'title' => $request->title, 'due_date' => $request->due_date ]);

のEloquentの処理だと最初に書いたSQLSTATE[HY000]: General error: 1364 Field 'main_task_id' doesn't have a default value (SQL: insert into tasks (title, due_date, updated_at, created_at) values (ランニング, 2019/11/20, 2019-11-19 12:18:24, 2019-11-19 12:18:24))のエラーが出てしまいます。

<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateMainTasksTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('main_tasks', function (Blueprint $table) { $table->increments('id'); $table->string('title', 20); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('main_tasks'); } }
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateTaskstable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('tasks', function (Blueprint $table) { $table->increments('id'); $table->integer('main_task_id')->unsigned(); $table->string('title', 100); $table->date('due_date'); $table->integer('status')->default(1); $table->timestamps(); // 外部キーを設定する $table->foreign('main_task_id')->references('id')->on('main_tasks'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('tasks'); } }

色々とググりながら様々な資料を見て確認したのですがなかなか解決できず

database.phpのstrictをtureからfalseに変えてもだめでした。

あと、dd($current_maintask);をして、maintaskのidは取得できたのに、$current_maintask->tasks()->save($task);に行くとデータが入ってないみたいです。

コメントアウトした属性ー>saveメソッドはうまく保存できたのに、createメソッドだとなぜ上手く行かないのか?
また、どういった処理になっているのかわからないので

ご回答のほうをよろしくお願いします。

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

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

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

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

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

guest

回答2

0

コメントアウトした属性ー>saveメソッドはうまく保存できたのに、createメソッドだとなぜ上手く行かないのか?

また、どういった処理になっているのかわからないので

tasks()->save()
の場合は、Laravelのリレーション機能により、関連するモデルのId(この場合だとmain_task_id)が自動的にセットされて保存されます。

一方、Task::createは、値のセットした後にDBへ保存までを行うメソッドですので
この時点でmain_task_idがnullのため、DBの制約でField 'main_task_id' doesn't have a default value という感じで止まる

という処理です。

投稿2019/11/19 13:28

mikkame

総合スコア5036

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

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

m2B

2019/11/19 14:10

ご回答ありがとうございます! Task::create場合だとNullになってしまい、データが入ってないんですよね。 そもそも$current_maintask->tasks()で'main_task_id' は入っていると思っているのですが、 どうやったらサブタスクにmain_task_idを入れることができるのですか? 空のままだとまずいですし... ご回答よろしくおねがいします。
mikkame

2019/11/19 14:20

> $current_maintask->tasks()->save($task); これなら自動的に入ると思いますが・・・。 Task::createする時も、引数をarray_mergeなどで事前にmain_task_idを含む配列に改変した上で渡せば保存できるかと思います
guest

0

自己解決

解決しました。

$current_maintask = MainTask::find($id); // dd($current_maintask); $task = Task::create([ 'title' => $request->title, 'due_date' => $request->due_date, 'main_task_id' => $current_maintask->id ]);

$current_maintask = MainTask::find($id)で定義したあとに
createメソッドの中に'main_task_id' => $current_maintask->id
追加した結果保存できました。

また

$current_maintask = MainTask::find($id); $current_maintask->tasks()->create([ 'title' => $request->title, 'due_date' => $request->due_date ]);

でも保存できたので、やり方も色々あるなと分かりました。

投稿2019/11/20 03:41

m2B

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問