mar-gitacount
@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: articles.user_id (SQL: insert into "articles" ("article", "updated_at", "created_at") values (test, 2020-12-31 05:11:42, 2020-12-31 05:11:42))

今Laravelでwebアプリを作成しているのですが、リレーションを利用して
userテーブルとarticleテーブルを連携させようと思っているのですが上記エラーが出てしまいます。
user_idの所で怒られています。文字通りidがIntegrityではないからかなとは思い
user側のidをbigInterityなどに変えるなどしたのですが、ダメでした、、

流れとしては
1.ユーザーログインする
2.記事作成というページ遷移ボタンを押しページに移動する。
3.textareaに任意の文章を書きこむ。
4.投稿ボタンを押下する。←ここでエラーが発生。
5.各ユーザーテーブルに個々の投稿した文章が表示されるようにする。

これでhasManyを利用してarticleと結びつける。

User.php
public function articles(){
        /**
         *一対多の一側
         * リレーション一対多の関係
         * user(1):article(多)
         * articleテーブルを新しい順で更新する。
         * 
         * 
           */
        return $this->hasMany('App\Models\Article')->latest();
    }
Article.php
  /**
     * 一対多の処理多側、articleの処理。
     * 
     *  */  
    public function user(){
        return $this->belongsTo('App\models\User');
    }

以下userとarticleのテーブル

create_users_table.php
<?php

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

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();//←これがarticle側でいうuser_id
            //$table->bigInteger('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

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


article_table.php
<?php

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

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->string('article');
            $table->string('article_title');
            $table->timestamps();

            /** 
             * 以下articleテーブルから親テーブルの外部キーに接続する。
             * 
             * ->default(1);←こいつがある限りidがiのユーザーしか反映されない。
             * 
            */

            $table->integer('user_id')->unsigned();
            $table->foreign('user_id') //外部キー制約
            ->references('id')//userのidカラムを参照する?
            ->on('users')//usersテーブルのidを参照する
            ->onDelete('cascade');//ユーザーが削除されたら紐付くpostsも削除               
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {

        Schema::dropIfExists('articles');

    }
}


ユーザー側のidをなにかしらIntegerの型にしなければならないのでしょうか、、

0

1Answer

articles.user_idはNULLを許容していない、にもかかわらずINSERT文でuser_idが指定されていないのが直接的な原因でしょう。

この場合、articles.user_idがNULLを許容するのか、許容すべきでないのかで対応が変わります。
NULLを許容するならNOT NULL制約を外すことになりますし、
許容すべきでないのならarticlesをINSERTする時にuser_idを指定する必要があります。

1Like

Comments

  1. @mar-gitacount

    Questioner

    ご回答ありがとうございます。
    ご指摘の通りarticlesをINSERTする際user_idを指定し、思惑通りに動かすことができました!!

Your answer might help someone💌