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

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

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

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

PHP

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

1610閲覧

シーディング実行時に「doesn't have a default value」のエラー

bokupiroki

総合スコア54

Laravel

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

PHP

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/11/05 04:01

編集2020/11/05 04:02

前提・実現したいこと

・Laravelを利用してローカル環境にサイトを作ろうとしています。
・データベースに情報を登録するため、シーディングを実行するもエラーが表示されてうまくいきません。

お手本のサイト(https://note.com/mukae9/n/naf7dff31b4db)の末尾に、

■migration機能を使ってid(bigIncrements),name(string,50),age(int)カラムを持ったmineテーブルを作る
■MineTableSeederを作成し、自分の名前と年齢をDBファサードで挿入できるようにする。
■シーディングを実行する。

との課題があるので、それに従って作ろうとしています。
(答えは書かれていません)

発生している問題・エラーメッセージ

MineTableSeeder.phpというファイルに記載した内容をテーブルに登録しようとしています。
しかしphp artisan db:seedを実行すると下記のような状況になります。

root@17fc25ef4b3d:/var/www/app# php artisan db:seed Seeding: StockTableSeeder Seeded:  StockTableSeeder (0.28 seconds) Seeding: MineTableSeeder   Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1364 Field 'bigIncrements' doesn't have a default value (SQL: insert into `mine` (`name`, `age`) values (yamada, 25))   at /var/www/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669     665|        // If an exception occurs when attempting to run a query, we'll format the error     666|        // message to include the bindings with SQL, which will make this exception a     667|        // lot more helpful to the developer instead of just the database's errors.     668|        catch (Exception $e) {   > 669|            throw new QueryException(     670|                $query, $this->prepareBindings($bindings), $e     671|            );     672|        }     673|   Exception trace:   1  PDOException::("SQLSTATE[HY000]: General error: 1364 Field 'bigIncrements' doesn't have a default value")       /var/www/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:463   2  PDOStatement::execute()       /var/www/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:463   Please use the argument -v to see more details.

「bigIncrements(IDのこと?)というフィールドにはデフォルトの値が設定されていません」
と言われているように見えます。

お手本のサイトでは「id(bigIncrements)」を作成する指示になっていますが、そもそも何のために作成するのか意図は理解できていません。

IDなので、上から順に自動で数字が割り振られるものなのかな?ぐらいに思っていました。

該当のソースコード

↓テーブル作成時に設定したマイグレーションファイル

php

1//2020_11_04_120350_create_mine_table.php 2 3<?php 4 5use Illuminate\Database\Migrations\Migration; 6use Illuminate\Database\Schema\Blueprint; 7use Illuminate\Support\Facades\Schema; 8 9class CreateMineTable extends Migration 10{ 11    /** 12    * Run the migrations. 13    * 14    * @return void 15    */ 16    public function up(){ 17        Schema::create('mine', function (Blueprint $table) { 18            $table->bigIncrements( 'id' ); 19            $table->timestamps(); 20 $table->string( 'name',50 ); 21 $table->integer( 'age' ); 22        }); 23    } 24 25    /** 26    * Reverse the migrations. 27    * 28    * @return void 29    */ 30    public function down() 31    { 32        Schema::dropIfExists('mine'); 33    } 34} 35

↓データベースへの情報登録に利用し用としているシーダー

php

1//MineTableSeeder.php 2 3<?php 4 5use Illuminate\Database\Seeder; 6use Illuminate\Support\Facades\DB; 7 8class MineTableSeeder extends Seeder 9{ 10  /** 11  * Run the database seeds. 12  * 13  * @return void 14  */ 15  public function run() { 16    DB::table( 'mine' )->truncate(); 17    DB::table( 'mine' )->insert( [ 18      'name' => 'yamada', 19      'age' => 25, 20    ] ); 21  } 22}

試したこと

■IDに空を登録できるか検証
コマンドphp artisan db:seedを実行したときに、上記エラーにこのようにありました。
"SQLSTATE[HY000]: General error: 1364 Field 'bigIncrements' doesn't have a default value"

いったん空の値を追加してみようと思い、マイグレーションファイルに
'id' => ,と追記してみました。

php

1//2020_11_04_120350_create_mine_table.php 2 3<?php 4 5use Illuminate\ Database\ Seeder; 6use Illuminate\ Support\ Facades\ DB; 7 8class MineTableSeeder extends Seeder { 9  /** 10  * Run the database seeds. 11  * 12  * @return void 13  */ 14  public function run() { 15    DB::table( 'mine' )->truncate(); 16    DB::table( 'mine' )->insert( [ 17      'id' => '',//追記 18      'name' => 'yamada', 19      'age' => 25, 20    ] ); 21  } 22} 23

コマンドphp artisan db:seedを再び実行すると下記のエラーになりました。

Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'id' at row 1 (SQL: insert into `mine` (`id`, `name`, `age`) values (, yamada, 25))

空ではNGみたいです。

シングルクオーテーションで囲んではいけないのか
とも思ったのですが、空にするなら囲まないとエディター上でエラーになります。

■数値なら登録できるか検証
id(bigIncrements)の役割はわかりませんが、数字をシーダーに入れておけば先に進めるか試しました。

'id' => 123,を追記しました。

php

1//2020_11_04_120350_create_mine_table.php 2 3<?php 4 5use Illuminate\ Database\ Seeder; 6use Illuminate\ Support\ Facades\ DB; 7 8class MineTableSeeder extends Seeder { 9  /** 10  * Run the database seeds. 11  * 12  * @return void 13  */ 14  public function run() { 15    DB::table( 'mine' )->truncate(); 16    DB::table( 'mine' )->insert( [ 17      'id' => 123,//追記 18      'name' => 'yamada', 19      'age' => 25, 20    ] ); 21  } 22}

↓シーディングを実行すると、やはりエラーです。

Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1364 Field 'bigIncrements' doesn't have a default value (SQL: insert into `mine` (`id`, `name`, `age`) values (123, yamada, 25)) at /var/www/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669 665| // If an exception occurs when attempting to run a query, we'll format the error 666| // message to include the bindings with SQL, which will make this exception a 667| // lot more helpful to the developer instead of just the database's errors. 668| catch (Exception $e) { > 669| throw new QueryException( 670| $query, $this->prepareBindings($bindings), $e 671| ); 672| } 673| Exception trace: 1 PDOException::("SQLSTATE[HY000]: General error: 1364 Field 'bigIncrements' doesn't have a default value") /var/www/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:463 2 PDOStatement::execute() /var/www/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:463 Please use the argument -v to see more details. root@17fc25ef4b3d:/var/www/app#

id(bigIncrements)の役割、何か値を登録するべきなのか
そもそも自動で何か値が割り振られるものなのかわかりませんでした。

どなたか知恵を貸していただけないでしょうか。

補足情報(FW/ツールのバージョンなど)

Windows10 pro
Docker version 19.03.13
php7.4.11

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

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

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

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

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

guest

回答1

0

自己解決

phpmyadminにログインして確認すると、mineテーブルの「id」カラムと表示されるべき部分が、「bigIncrements」というカラム名になっていることが原因だったようです。

初回マイグレーションファイル作成時に何か記述ミスをしていたのかもしれません。

phpmyadminからmineテーブルを削除
2020_11_04_120350_create_mine_table.phpを削除

laravelのappディレクトリにてキャッシュの削除を実行

↓migrationファイル再生成

/var/www/app# php artisan make:migration create_mine_table

作成したmigrationファイルを書き直し

php

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreateMineTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('mine', function (Blueprint $table) { 17 $table->bigIncrements('id'); 18 $table->timestamps(); 19 $table->string('name',50); 20 $table->integer('age'); 21 }); 22 } 23 24 /** 25 * Reverse the migrations. 26 * 27 * @return void 28 */ 29 public function down() 30 { 31 Schema::dropIfExists('mine'); 32 } 33}

↓キャッシュ削除(これをしないとデータベースに反映されなかった)してからテーブル作成

/var/www/app# php artisan config:cache /var/www/app# php artisan migrate

↓シーダーを編集(特にIDの指定は不要であった)

php

1<?php 2 3use Illuminate\ Database\ Seeder; 4use Illuminate\ Support\ Facades\ DB; 5 6class MineTableSeeder extends Seeder { 7 /** 8 * Run the database seeds. 9 * 10 * @return void 11 */ 12 public function run() { 13 DB::table( 'mine' )->truncate(); 14 DB::table( 'mine' )->insert( [ 15 'name' => 'yamada', 16 'age' => 25, 17 ] ); 18 } 19}

↓シーディング

/var/www/app# php artisan db:seed

これでうまくいきました!

投稿2020/11/05 15:55

編集2020/11/05 16:05
bokupiroki

総合スコア54

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問