11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

laravel SQLSTATE[HY000]: General error: 1364 Field 'カラム名' doesn't have a default value

Last updated at Posted at 2021-01-21

#はじめに
今回、先日作成したmake:authでログイン機能を実装しました。
そこに、オリジナルのカラムを作成し充実した登録サイトを作成している時にエラーが発生しました。
createメソッドがいまいち分かっていなかったからこそ出現したエラーです。
今後このようなエラーが無いように備忘録として投稿します。

#投稿者の環境

  1. MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
  2. macOS Big Sur バージョン11.0.1
  3. Laravel Framework 6.20.7
  4. PHP 7.3.23

#エラーのスクショはこちらになります
###ローカルサーバー
“スクリーンショット” 2021-01-20 13.50.47 (1).jpg

###phpmyadminの画像
“スクリーンショット” 2021-01-20 22.31.26.jpg

#エラーの解説
氏名にカタカナを入力するカラムの(name_kana)デフォルト値が空白です。という意味になります。

#仮説
まず、カラム名のid name password created_at updated_atはデータが入力されています。
しかし、他のカラムは0で保存されています(強制的に登録しました)。
そうしたら、createメソッドで定義を忘れている可能性があるかも・・・
そう思い、調べてみました。

RegisterController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'name_kana' => ['required', 'string', 'max:255'],
            'gender' => ['required','boolean'],
            'age' => ['required','digits:2'],
            'birthday' => ['required','integer'],
            'postal_code' => ['required','digits:7'],
            'address' => ['required','max:800'],
            'phone' => ['required','numeric','digits_between:10,11'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }


    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
}

#原因
単なるcreateメソッドに$dataを渡していなかったからです。  
これではフォームに値を入力してもDBには0で登録されることが分かりました。
以下コードを下記のように編集しました。

RegisterController.php
//省略

protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'name_kana' =>$data['name_kana'], //追加
            'gender' =>$data['gender'], //追加
            'age' => $data['age'], //追加
            'birthday' => $data['birthday'], //追加
            'postal_code' => $data['postal_code'], //追加
            'address' => $data['address'], //追加
            'phone' => $data['phone'], //追加
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
//省略

#結果
スクショはこちらになります。ちゃんとデータが保存されています。
“スクリーンショット” 2021-01-21 11.34.01.jpg

#最後に
createメソッドの役割をある程度理解できた出来事になりました。
また、ターミナルで簡単にログイン機能を実装できますが私を含め初心者には何でこの表示が出るの?何でデータが保存されているの?などなどの疑問が湧いてきました。初心者にとってこの辺りは非常に分かりにくいと思います。 今回の件で、ログイン機能がどのように機能し保存ができているのかをよく調べるきっかけとなったので非常に良い体験になりました。

#参考ホームページ一覧
Laravel6 ログイン機能を実装する
LaravelでMySQLへのデータ挿入時にエラーが出た場合の対処法
Laravelの認証機能をカスタマイズしたい

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?