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

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

ただいまの
回答率

88.92%

General error: 1364 Field 'user_id' doesn't have a default valueのエラー対処方法(seed作成時)

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 152

前提・実現したいこと

初心者です。PHPのフレームワークLaravelを使って旅行投稿サイトを製作中です。
コンテンツのサンプルデーターを作りたくシードでサンプルデータを作ろうとしています。
しかし、artisanコマンド作成しようとしてもエラーが表示されてしまいます。
user_idのnullは強要しません。

ご教示いただけますと幸いです。

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

SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `contents` (`title`, `content`, `continent`, `country`, `span`, `costs`, `picture`) values (初めての海外旅行, 本当に楽しかった。, アジア, 中国・ 韓国・台湾, 15, 200000, 写真がいっぱい1))

該当のソースコード

マイグレーションファイル

 public function up()
    {
        Schema::create('contents', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->string('title' , 50);
            $table->string('continent');
            $table->string('country');
            $table->string('picture');
            $table->string('content' , 500);
            $table->integer('costs');
            $table->integer('span');
            $table->timestamps();

            //外部キー制約
            $table->foreign('user_id')->references('id')->on('users');
        });

    }

Content モデル

class Content extends Model
{
    protected $fillable = ['content' , 'title' ,  'picture' , 'span' , 'costs' , 'continent' , 'country'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}


ContentsTableSeeder

public function run()
    {
        for($i=1 ; $i<=5 ; $i++)
        {
            DB::table('contents')->insert([
                'title'=>'初めての海外旅行',
                'content'=>'本当に楽しかった。',
                'continent'=>'アジア',
                'country'=>'中国・韓国・台湾',
                'span'=>'15',
                'costs'=>'200000',
                'picture'=>'写真がいっぱい'.$i
                ]);
        }
    }

試したこと

・ALTER TABLE テーブル名 ALTER フィールド名 SET DEFAULT デフォルト値;でデフォルト値を設定してもうまくいきませんでした。

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

Laravel Framework 6.18.22

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

デフォルトでは、nullが許可されていないので、
nullでもいいのなら、nullable()が必要です。

// before
$table->unsignedBigInteger('user_id');

// after
$table->unsignedBigInteger('user_id')->nullable();

nullを許可しないなら、以下のようにuser_idを入れないといけません。
以下の例では、idが1のユーザーがいる前提で動きます。また、contentsの追加されるデータのuser_idは全て1になります。

public function run()
    {
        $user = User::find(1);
        for($i=1 ; $i<=5 ; $i++)
        {
            DB::table('contents')->insert([
                'title'=>'初めての海外旅行',
                'user_id' => $user->id,
                'content'=>'本当に楽しかった。',
                'continent'=>'アジア',
                'country'=>'中国・韓国・台湾',
                'span'=>'15',
                'costs'=>'200000',
                'picture'=>'写真がいっぱい'.$i
                ]);
        }
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/06 18:35

    Userクラスの、名前空間が、以下のように設定してあれば、
    namespace App;

    ContentsTableSeederに以下のような記述があれば、その点に関しては問題ないはずです。
    ```
    <?php
    use Illuminate\Database\Seeder;
    use App\User;
    class ContentsTableSeeder extends Seeder {
    以下略
    ```

    キャンセル

  • 2020/07/06 18:58

    返信ありがとうございます。
    上記のように訂正したら正常に動きました。
    ありがとうございました。

    キャンセル

  • 2020/07/06 19:02

    良かったです。
    名前空間については、以下やphp.netなどを参考にしてみてください。
    https://qiita.com/7968/items/1e5c61128fa495358c1f

    キャンセル

0

回答ありがとうございます。

追加で質問よろしいでしょうか?説目不足で申し訳ないのですが、useとcontentsで一対多の関係で設計しております。ユーザーはシードでサンプルデータを作成しております。

public function run()
    {
        for($i=1 ; $i<=10 ;  $i++)
        {
            DB::table('users')->insert([
                "name"=>"testさん" .$i,
                "email"=>"test@test.jp".$i,
                "password"=>"kaai1733".$i
                ]);
        }
    }


これでユーザーid1のユーザーは作成しました。User::find(1)としっかりと表示はされました。

しかし、User classは存在しないとエラー表示されてしまいます。User modelは作成してあります。

public function run()
    {
        $user = User::find(1);
        for($i=1 ; $i<=5 ; $i++)
        {
            DB::table('contents')->insert([
                'title'=>'初めての海外旅行',
                'user_id' => $user->id,
                'content'=>'本当に楽しかった。',
                'continent'=>'アジア',
                'country'=>'中国・韓国・台湾',
                'span'=>'15',
                'costs'=>'200000',
                'picture'=>'写真がいっぱい'.$i
                ]);
        }
    }

なぜこのエラーが出てしまうのかさっぱりでどう対処したらいいのか分からず困っています。少しでもご教示いただけると幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る