taro10890
@taro10890

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

laravelでデータベースにレコードを追加する際にエラーがでる

解決したいこと

laravelのコントローラーでfill()を使ってデータベースにレコードを作ろうとすると、roomId,commentの値がnullというエラーが出る。
開発環境は下記のとおりです。
laravel 8
データベース:sqlite

発生している問題・エラー

SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: comments.roomId (SQL: insert into
 "comments" ("id", "updated_at", "created_at") values (1, 2021-03-16 21:54:25, 2021-03-16 21:54:

該当するソースコード

homeContoller.php

public function watch(Request $request)
    {
        $id = $request->id;
        $roomData = DB::table('rooms')->where('id', $id)->first();
        return view('watch', ['roomData' => $roomData]);
    }

public function ajax(Request $request)
    {
        $commentForm = $request->all();
        $comment = new Comment;
        unset($commentForm['_token']);
        $comment->fill($commentForm)->save();
        return $comment;
    }

watch.blade.php

@section('body')
    <div class="movieBlock">
        <iframe src="{{$roomData->movieUrl}}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
        <div class='commentList'></div>
        <form action="/watch/ajax?id={{$roomData->id}}" method="post" class="commentBlock">
            @csrf
            <p>{{$roomData->id}}</p>
            <input type="text" name="comment">
            <input type="number" name="roomId" value="{{$roomData->id}}">
            <input type="submit" value="コメントする" class="commentBtn">
        </form>
    </div>
    <script type="module" src="{{asset('js/comment.js')}}"></script>
@endsection

Comment.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    use HasFactory;

    protected $fillable = [
        'id',
    ];
}

2021_03_16_create_comments_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCommentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->increments('id');
            $table->string('roomId');
            $table->string('comment');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('comments');
    }
}

自分で試したこと

1.not nullと言われるroomId,commentからnot null制約?を外し、データベースでレコードの確認をしましたが、どちらもnot nullになっていました。

2.
php
$comment->roomId = $request->roomId;
$comment->comment = $request->comment;
$comment->save();

では上手く動きましたが、create()->やfill()を使うと、roomIdやcommentがnot nullになってしまうのがなぜだかわかりません。
laravelを学習し始めて間もないので、簡単なミスかもしれませんが、教えていただけると嬉しいです。

0

1Answer

LaravelではHTML書き換えなどで不正な値を入力するのを防ぐため、fill()を使う場合は$fillableに記載された項目以外を受け付けないようになっています。

そのため下記のCommentモデルの$fillableに入力対象(今回の場合はroomIdcomment)を記載する必要があります。

また$fillableの対として$guardedもあります。
Eloquentの準備 8.x (再翻訳中)Laravel

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    use HasFactory;

    protected $fillable = [
        'id',
    ];
}
0Like

Comments

  1. @taro10890

    Questioner

    ありがとうございます!
    解決いたしました!

    分からないワードをそのままにしてたので、これからは気を付けます...

Your answer might help someone💌