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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

3056閲覧

idがdefault valueとのエラーが出てしまいます

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2017/08/08 03:46

編集2017/08/08 05:00

問題:管理画面からjob_idに数字を登録しょうとすると連携したuser_idやオリジナルのjob_idがdefault valueとのエラーが出てしまいます、NULLにすればいいですがNULLにすると何も入力されません。

エラー:

SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `jobs` (`updated_at`, `created_at`) values (2017-08-08 12:34:30, 2017-08-08 12:34:30))

どうすれば解決できますでしょうか?誰か教えてくださいませ!!

Jobテーブル:
id | user_id | job_id |created_at | updated_at

説明:job_idは今回エラーが出ているカラムになりますが、Jobテーブルにjob_idを作った理由はjob_idを管理画面からオリジナルJob_idを登録するためです。

Userテーブル:

id | name | created_at | update_at

JobController.php

class JobsController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $jobs = Job::all(); return view('admin.jobs.index', compact('jobs')); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { $jobs = Job::pluck('job_id')->all(); return view('admin.jobs.index',compact('jobs')); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { Job::create($request->all()); return redirect('/admin/jobs/index'); }

index.blade.php

<div class="col-sm-8"> {!! Form::open(['method'=>'POST', 'action'=> 'JobsController@store']) !!} {{ csrf_field() }} <div class="form-group"> {!! Form::label('job_id','Job_ID') !!} {!! Form::text('job_id',['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::submit('create Job_id', ['class'=>'btn btn-info']) !!} </div> {!! Form::close() !!}

JobModel:

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Job extends Model { protected $fillable = [ 'user_id ', 'job_id', ]; public function user(){ return $this->belongsTo('App\User'); } }

UserModel:

<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password','address', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; public function jobs(){ return $this->hasMany('App\Job'); } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

user_idカラムにインサートがされていませんね。あとjob_idカラムにも。

insert into `jobs` (`updated_at`, `created_at`) values (2017-08-08 12:34:30, 2017-08-08 12:34:30)

現在はupdated_atとcreated_atしか入れれてないことになっています。

JobControllerのstoreメソッド内で、dd($request->all())を見て、求めている情報が入っているか確認してください。
確認したら恐らくuser_idが入っていないと思います。user_idはAuthなどから取得してきて入れる必要があります。(Auth::user()->idとか)

また、createメソッドを使うと複数代入扱いなのでModelにfillableまたはguarded属性が必要です。
fillable属性を指定している場合は、代入出来る属性にjob_idとuser_idが含まれているか確認してください。
複数代入に関しては以下を参照してください。。。
https://readouble.com/laravel/5.1/ja/eloquent.html#mass-assignment

投稿2017/08/08 03:58

編集2017/08/08 04:30
fagai

総合スコア2158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/08 04:56

@fagai 回答ありがとうございます!! >>JobControllerのstoreメソッド内で、dd($request->all())を見て、求めている情報が入っているか確認してください。 求めている情報は全部入れました。 =>>Modelにfillable 指定しています。 JobModelに書いています 一番下に追加しました。
fagai

2017/08/08 05:01

ソース上ではuser_idを入れているところが確認できませんが、何処か別のところから入れているのですか?
退会済みユーザー

退会済みユーザー

2017/08/08 05:01

ご指摘通り(Auth::user()->idとか)を追加したら下記のエラー出ました Trying to get property of non-object
退会済みユーザー

退会済みユーザー

2017/08/08 05:03

user_idは入れていません、連携する為に設定しただけです
fagai

2017/08/08 05:11 編集

user_idを入れていないとなると、その部分でNOT NULL制約に縛られてエラーになります。 もしuser_idの中身を最初に入れる必要がないのであれば、not null制約を無効にしたほうが良いと思います。 (マイグレーションならnullable()をつける https://readouble.com/laravel/5.1/ja/migrations.html#creating-columns )
退会済みユーザー

退会済みユーザー

2017/08/08 05:12

はい、nullableはつけています マイグレーションは下記です public function up() { Schema::create('jobs', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id')->nullable(); $table->integer('job_id')->unsigned()->index(); $table->timestamps(); }); }
fagai

2017/08/08 05:16

となると、$table->integer('user_id')->nullable()->default(null); としたらどうでしょう? あまり気にせずともnull値が入ったような記憶も少しありはするのですがよく覚えてないです・・・
fagai

2017/08/08 05:27 編集

また、試しに Job::create(['job_id' => 1, 'user_id' => null]); としてみて正しくデータが挿入されますか?
退会済みユーザー

退会済みユーザー

2017/08/08 05:44

データガ挿入されませんでした、エラーが出ました (1/1) ErrorException Trying to get property of non-object
退会済みユーザー

退会済みユーザー

2017/08/08 05:46

$user_id = Auth::user()->id;をコメントアウトすれば、Job_idに1が挿入されます
fagai

2017/08/08 05:50 編集

あああ、すみません。そのAuth::user()->idは例として上げただけなので利用しない/してないのであれば消してもらって大丈夫です!
fagai

2017/08/08 05:59

最初、user_idを入れる必要があるという認識だったのでそういう回答になってしまいました。。。
退会済みユーザー

退会済みユーザー

2017/08/08 06:00

了解しました。
fagai

2017/08/08 06:09

一点言い忘れてしまったのですが、$request->all()をそのままcreateに入れるのはセキュリティ的に問題があるので(他人がカラム名をいじったり出来る)、$request->only(['job_id']) のようにするほうが良いかと思いました。
退会済みユーザー

退会済みユーザー

2017/08/08 06:47

ありがとうございます。 了解致しました
fagai

2017/08/08 07:23

まだ解決されていないところがある感じです・・・?
退会済みユーザー

退会済みユーザー

2017/08/08 08:58

はい、そうです!!うまく挿入できないです!! selectでuser_idのnamaを取得し、さらにjob_idとテーブルに挿入したくて苦戦しています
退会済みユーザー

退会済みユーザー

2017/08/08 09:02

user_idをselectで挿入したいですがdoesn't have a default valueのエラーが出ます、nullしたら何も挿入されなくなるからだめですね (2/2) QueryException SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `jobs` (`job_id`, `updated_at`, `created_at`) values (9999, 2017-08-08 18:01:25, 2017-08-08 18:01:25))
退会済みユーザー

退会済みユーザー

2017/08/08 09:27

下記のFormが問題みたいです。挿入はできますがカラム名前が登録されてしまいます!! どこ間違っていますか? <div class="form-group"> {!! Form::label('user_name','広告主名') !!} {!! Form::select('name',[''=>'選択広告主名'] + $users->toArray(),'',array ('class'=>'form-control')); !!} </div>
退会済みユーザー

退会済みユーザー

2017/08/08 11:07

idがdefault valueとのエラーが出てしまいますの問題は解決したので、こちら質問は閉めます!!
fagai

2017/08/08 12:40

なるほど、ユーザの一覧があってそのidを登録したいけど登録できてないということですね。 $usersの中身がどうなっているのかわからないのですが、普通にallとかで取っているなら {!! Form::select('user_id',[''=>'選択広告主名'] + array_pluck($users, 'name', 'id') ,'',array ('class'=>'form-control')); !!} などとすればkeyがidでvalueが名前の配列が入るのでうまくいくと思いますよ!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問