@mar-gitacount (mar mar)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: votings.name (SQL: insert into "votings" ("name", "updated_at", "created_at") values (?, 2020-12-17 17:35:44, 2020-12-17 17:35:44))

現在トップページから文章を投稿するためのコードを記載しているのですが、上記のエラーが出てしまい戸惑っています。
テーブル名:votings
モデル名:Voting

<?php

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

class CreateVotingsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('votings', function (Blueprint $table) {
            $table->id();
            $table->String('name');
            $table->String('article');
            $table->timestamps();
        });
    }

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


web.php
<?php

use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Route;
use App\Models\Voting;
use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    /* Votingモデルを全て取得して表示する。 */
    $votings = Voting::all();
    return view('votings', ['votings' => $votings]);
});

//Postはデータを送信するという意味
Route::post('/voting', function (Request $request) {
    $validator = Validator::make($request->all(), [
        'result' => 'required|max:255',
    ]);

    $voting = new Voting;
    $voting->name = $request->result;
    $voting->save();
    return redirect('/');
});



votings.php
@extends('layouts.app')

@section('content')
<div class="container">
    <div class="col-sm-offset-2 col-sm-8">
        <div class="panel panel-default">
            <div class="panel-heading">
                新しい記事
            </div>

            <div class="panel-body">
                @include('common.errors')
                <!-- 新しい投稿を作る -->
                <form action="/voting" method="POST" class="form-horizontal">
                    {{ csrf_field() }}
                    <!-- 記事の名前 -->
                    <div class="form-group">
                        <label for="task-name" class="col-sm-3 control-label">記事</label>
                        <div class="col-sm-6">
                            <input type="text" name="name" id="voting-name" class="form-control" value="{{ old('voting')}}">
                        </div>
                    </div>
                    <!-- add voting -->
                    <div class="form-group">
                        <div class="col-sm-offset-3 col-sm-6">
                            <button type="submit" class="btn btn-default">
                                <i class="fa fa-plus"></i>記事を追加する
                            </button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
        <!-- 記事一覧 -->
        @if (count($votings)>0)
           <div class="panel-body">
               <div class="panel-heading">
                記事一覧
               </div>

               <div class="panel-body">
                   <table class="table table-striped task-table">
                       <thead>
                           <th>記事</th>
                           <th>&nbsp;</th>
                        </thead>
                       <tbody>
                           @foreach ($votings as $voting)
                              <tr>
                                  <td class="table-text">
                                      <div class="table-text">{{$voting->name}}</div>
                                  </td>
                            <!-- 記事削除 -->
                                   <td>
                                       <form action="/voting/{{ $voting->id}}" method="POST">
                                           {{ csrf_field() }}
                                           {{ method_field('DELETE') }}

                                            <button type="submit" class="btn btn-danger">
                                                <i class="fa fa-trash"></i>削除
                                            </button>
                                        </form>
                                    </td>
                                </tr>
                            @endforeach
                        </tbody>
                    </table>
                </div>
            </div>
        @endif
    </div>
</div>
@endsection

処理としては$table->String('name')というテーブルに記事を追加するというボタンを押したら値を追加しトップページに表示するという流れなのですが、、お力をお貸しください。

0 likes

3Answer

フォームからは名前を name パラメータで送っているのに result を読んでいるのが原因では。

Route::post('/voting', function (Request $request) {
    $validator = Validator::make($request->all(), [
        // name にする
        'name' => 'required|max:255',
    ]);

    // 今は $validator を作るだけでバリデーションしていない。するならこう
    if ($validator->fails()) {
        return redirect('/')
            ->withErrors($validator)
            ->withInput();
    }

    $voting = new Voting;
    $voting->name = $request->name; // ここも name にする

    ...
1Like

Comments

  1. @mar-gitacount

    Questioner

    ご指摘ありがとうございます。ご指摘の通り
    formからnameパラメータを送っていたので 
    result→nameに変更してもう一度試みたのですが、、

    ```SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: votings.article (SQL: insert into "votings" ("name", "updated_at", "created_at") values (Laravel, 2020-12-18 05:58:00, 2020-12-18 05:58:00))
    ```
    が吐かれます。
  2. $voting->name はセットできていますね。後は votings テーブルの article カラムにも NOT NULL 制約がついているので、 $voting->article もセットする必要があります。(使われていないようなので、不要ならカラムを消してもいいと思いますが)
  3. @mar-gitacount

    Questioner

    長々とお付き合いいただきありがとうございます。
    NONULL制約があるので、値を入れないとエラーになるという記事をちらほら確認できたので
    それを許可にするには->nullable()->change();を利用するといいという事だったので
    $table->String('article')->nullable()->change();
    を記載しましたが、全く同じエラーが吐かれます。
    試しにarticleカラムを削除してもう一度接続しても同じエラーが吐かれます、、

    migrateリフレッシュしたところvotingテーブルというやつが悪さしてるのかなとおもったのですが、、

    Rolling back: 2020_12_12_192229_create_votings_table
    Rolled back: 2020_12_12_192229_create_votings_table (12.62ms)
    Rolling back: 2019_08_19_000000_create_failed_jobs_table
    Rolled back: 2019_08_19_000000_create_failed_jobs_table (5.71ms)
    Rolling back: 2014_10_12_100000_create_password_resets_table
    Rolled back: 2014_10_12_100000_create_password_resets_table (6.84ms)
    Rolling back: 2014_10_12_000000_create_users_table
    Rolled back: 2014_10_12_000000_create_users_table (7.01ms)
    Migration not found: 2020_12_12_192229_create_voting_table ←こいつです
    Migrating: 2014_10_12_000000_create_users_table
    Migrated: 2014_10_12_000000_create_users_table (15.22ms)
    Migrating: 2014_10_12_100000_create_password_resets_table
    Migrated: 2014_10_12_100000_create_password_resets_table (14.09ms)
    Migrating: 2019_08_19_000000_create_failed_jobs_table
    Migrated: 2019_08_19_000000_create_failed_jobs_table (12.74ms)
    Migrating: 2020_12_12_192229_create_votings_table
    Migrated: 2020_12_12_192229_create_votings_table (7.11ms)


  4. $table->String('article')->nullable()->change();

    これはたぶん新しいマイグレーションファイルを作ってそこに書いてマイグレーションを実行しないと意味がないですね。

    Migration not found: 2020_12_12_192229_create_voting_table

    このエラーについては、 create_voting_table の voting が単数形になってますが、文字通りこれが出力されましたか? 他のメッセージにはここが複数形になっただけの似た名前が出ていますね。

    Migrating: 2020_12_12_192229_create_votings_table

    など。一度マイグレーションを実行した後にファイル名を変更したりしていませんか? それだとマイグレーション履歴が不整合になりそうです。

    ともかく、リフレッシュがうまくいっていないようです。代わりに php artisan migrate:fresh (refresh ではなく fresh)を試してください。これはデータベースを削除してマイグレーションをやり直します。
  5. migrate:fresh でマイグレーションをゼロからやり直すのであれば、そして 2020_12_12_192229_create_votings_table.php がもっとも新しい日付のマイグレーションファイルであれば、これを編集して

    $table->id();
    $table->String('name');
    $table->String('article'); // この行

    を削除して article カラムを最初から作らなかったことにするのが簡単だと思います。

    ただ、もしもこれより新しいマイグレーションファイルがあるときは、後続のマイグレーションに影響するかもしれなので編集しないでください。また一般的に言って一度実行したマイグレーションファイルの編集・削除・リネームも避けてください。
  6. @mar-gitacount

    Questioner

    初めてララベルを触った時にテーブル名をcreate_voting_tableにしてしまい、そのあとにララベルのテーブル名は複数系にするお作法のようなものがあるときいたので、手動でcreate_votings_tableにしました、、それが原因かなと思います。
    php artisan migrate:freshをしたら、votingが消えました!!
    udemyの教材を元に自分でもサービスを制作しているので、思わぬエラーに引っかかってしまうのだろうと思います、、
    $table->String('article'); // この行
    も削除しましたところ、とりあえずは動きました。
    ファイル名変更はむやみやたらにしないように気を付けます、、
    ご助力のおかげでなんとか動いたので感謝です!!
    ありがとうございました。

nameが未設定ですってエラー出てますね。
Laravelよく分かってないので雰囲気で回答しますが、以下のname設定してるところがおかしい気がします。

web.php
Route::post('/voting', function (Request $request) {
    ...
    $voting->name = $request->result;
});
0Like

Comments

  1. @mar-gitacount

    Questioner

    votingテーブルファイル名をvotingsテーブルファイル名に手動で直していたので
    サーバー接続した際votingテーブルなんて無いよ!!というのが原因だったのかと思われます。
    ご協力ありがとうございます。

votings.nameにNOT NULL制約があり、それに対してNULLをセットしようとしていることが原因です。

$voting->name = $request->result;

おそらく値が入っておらずNULLになっているのでしょう。
dd()dump()などで値がどうなっているか確認してみてはいかがでしょうか?

dd($request->result);
0Like

Comments

  1. @mar-gitacount

    Questioner

    ddで出力したところ、値は入っているぽいのですがやはり同じエラーになります、、

    name => Laraver ←入力した値

    ![スクリーンショット 2020-12-18 070851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/826735/3337cce2-b14e-60d5-17fe-59883951238a.png)


    ![スクリーンショット 2020-12-18 070112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/826735/4aa7c4ec-fc87-544b-7ed7-0f90e9397662.png)
  2. これは$votingをdd出力した結果で、他の方の指摘に対応された後ではないでしょうか?
    とすると、少なくとも私が指摘した点は解決していると思います。

Your answer might help someone💌