How can I resolve Integrity Constraint violation in Laravel

Issue

Here is my teachers migrations file:

$table->id();
$table->unsignedbiginteger('level_id');
$table->foreign('level_id')->references('id')->on('levels');
$table->string('teacher_name'); 
$table->string('teacher_email')->unique();           
$table->string('teacher_home_phone');
$table->string('teacher_mobile_phone');
$table->string('teacher_work_phone');
$table->string('teacher_home_address');
$table->string('teacher_suburb');
$table->string('teacher_postcode');
$table->string('teacher_username');
$table->string('teacher_password');                      
$table->timestamps();

Here is the levels migrations file:

$table->bigIncrements('id');            
    $table->string('level_name');
    $table->timestamps();
});

Teachers form.blade.php:

<div class="form-group col-md-5">                    
    <label for="teacher_levels" class="required">Mention levels Instructor's going to teach </label>                
    <div class="col-md-12">                                
        @foreach($levels as $level)                
        <div class="form-check form-check-inline col-md-3">
            <input class="form-check-input" type="checkbox" name="level_id[]" value="{{@$level->level_id}}" 
                    @if(isset($level->level_id) && @in_array('', @$level->level_id)) {{'checked'}} @endif>
            <label class="form-check-label">{{@$level->level_id}}</label>                            
        </div>
        @endforeach
    </div>
</div>

Here is my teachers model.php:

class Teacher extends Model
{
    use HasFactory;
    protected $fillable= ['level_id','teacher_name','teacher_email',
                            'teacher_home_phone','teacher_work_phone',
                            'teacher_mobile_phone','teacher_home_address',
                            'teacher_suburb', 'teacher_postcode',
                            'teacher_username', 'teacher_password',];

    public function levels()
    {
        return $this-> belongsTo(Levels::class, 'level_id');
    }                     
}

This is my levelsmodel.php

class Levels extends Model
{
    use HasFactory;

    public function teacher()
    {
        return $this -> hasMany(Teacher::class);
    }

}

Here is my TeacherController.php:

class TeacherController extends Controller
{
    /**
     * Create a new controller instance
     * 
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard
     * 
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function index()
    {
        $teachers= Teacher::all();
        $levels = Levels::all();
        return view('admin.teachers.list', compact('teachers', 'levels'));
    }

    /**
     * Show the application dashboard
     * 
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function add()
    {
        $teacher = array();
        $levels = Levels::all();
        return view('admin.teachers.add', compact('teacher', 'levels'));
    }

    /**
     * Store a newly created resource in storage
     * 
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //get form data
        $data = $request->all();

        //Check if teacher is already registered
        $teacher = Teacher::where('teacher_email', $data['teacher_email'])->first();

        //Teacher Check
        if($teacher){
            return redirect()->back()->with('error', 'Teacher is already registered, please check teacher email!');

        }
        

        //Handle Teacher''s level data
        $levels = Levels::all();

        //Check if teacher is already registered
        $user = User::where('email', $data['teacher_email'])->first();

        //User Check
        if($user){
            return redirect()->with('error', 'Teacher email is already registered, please check teacher email');

        }

        //Create Teacher Record
        $teacher = Teacher::create($data);

        //Create User
        $user = User::create([
            'name' => $data['teacher_name'],
            'email' => $data['teacher_email'],
            'password' => Hash::make($data['teacher_password'])
        ]);

        //Assign Above Teacher Role
        $user->assignRole('Teacher');

        //Update teacher column
        $teacher->update([
            'teacher_id' => $teacher->id
        ]);

        if(isset($data['save_close']) && $data['save_close']){
            return redirect()-> route('teacher.index')->with('message', 'Teacher information is saved successfully! ');
        }elseif(isset($data['save_add']) && $data['save_add']){
            return redirect()->back()->with('message','Teacher information is saved successfully!');
        }
    }
    /**
     * Show the form for editing the specified resource
     * 
     * @param int $id
     * @return \Illuminate\Http\Response
     */

     public function edit($id)
     {
        $teachers = Teacher::find($id);
        $levels = Levels::all();
        if($teacher){
            //Teacher Level Convert to Array
            if($teachers->level_id){
                $teachers->level_id = (json_decode($teachers->level_id));
            }
            return view('admin.teachers.edit', compact('teacher', 'levels'));
        }else{
            aboort(404);
        }

        
     }
     
      /**
       * Update the specified resource from url teachers/lists
       * 
       * @param \Illuminate\Http\Request
       * @param int $id
       * @return \Illuminate\Http\Response 
       */
      public function update(Request $request, $id)
      {
        //get form data
        $data = $request->all();

        //Get Teacher Record
        $teacher = Teacher::find($id);
        $teacher->fill($data)->save();

        //Update Password
        if(isset($data['teacher_password']) && $data['teacher_password']){
            $user = User::where('email', $teacher->teacher_email)->first();
            $user->update([
                'password' => Hash::make($data['teacher_password'])
            ]);
        }

        if(isset($data['save_close']) && $data['save_close']){
            return redirect()->route('teacher.index')->with('message', 'Teacher information updated successfully!');
        }elseif(isset($data['save_add']) && $data['save_add']){
            return redirect()->back()->with('message', 'Teacher information updated successfully!');
        }

      }

      /**
       * Remove the specified resource from storage
       * 
       * @param int $id
       * @return \Illuminate\Http\Response
       */
      public function delete($id)
      {
        // Delete the row pointed to by teacher ID
        $teacher = Teacher::findorFail($id);
        //Find User
        $user = User::find($teacher->teacher_id);
        if($user){
            $user->removeRole('Teacher');
            //Delete Teacher
            
            $teacher->delete();
            //Delete User
            $user->delete();
        }else{
            //Delete Teacher
            $teacher->delete();
        }

        return redirect()->route('teacher.index');
      }
}

When I click on the save and close buttons I get this error: Integrity constraint violation: 1048 Column ‘level_id’ cannot be null. I need some help on how can I resolve this issue. One Teacher can teach multiple levels and Multiple levels are taught by one teacher. I want it to be displayed in the listing.
attributes of levels tables

Solution

Change $level->level_id to $level->id

@foreach($levels as $level)                
    <div class="form-check form-check-inline col-md-3">
        <input class="form-check-input" type="checkbox" name="level_id" value="{{ $level->id }}" @checked($level->id == old('level_id'))>
        <label class="form-check-label">{{ $level->id }}</label>                            
    </div>
@endforeach 

Answered By – JS TECH

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published