Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

shahr's avatar
Level 10

How to add skill language with laravel?

I have a form languages like this.

lang

How to work it with laravel?

I have three tables users, languages.

public function up()
{
    Schema::create('languages', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->timestamps();
    });

    Schema::create('language_user', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->bigInteger('language_id')->unsigned()->nullable();
        $table->foreign('language_id')->references('id')->on('languages')->onDelete('cascade');
        $table->bigInteger('user_id')->unsigned()->nullable();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->unique(['language_id', 'user_id']);
        $table->integer('reading_skill')->nullable();
        $table->integer('writing_skill')->nullable();
        $table->integer('listening_skill')->nullable();
        $table->timestamps();
    });
}

HomeController.pp

public function index()
{
    $languages = Language::all();
    return view('Home.test', compact('languages'));
}

User.php

public function languages()
{
    return $this->belongsToMany(Language::class)->withPivot('reading_skill', 'writing_skill', 'listening_skill');
}

index.blade.php

'<div class="col-md-12 position-relative">\n' +
'<i class="fas fa-times text-danger position-absolute"></i>' +
'<div class="row">\n' +
'<div class="col-md-3">\n' +
'<div class="form-group">\n' +
'<label for="language_id">language_id</label>\n' +
'<select id="language_id" name="language_id[]" class="form-control">\n' +
'@foreach($languages as $language)\n' +
'<option value="{{ $language->id }}">{{ $language->name }}</option>\n' +
'@endforeach\n' +
'</select>\n' +
'</div>\n' +
'</div>\n' +
'<div class="col-md-3">\n' +
'<div class="form-group">\n' +
'<label for="reading_skill">reading_skill</label>\n' +
'<select class="form-control" id="reading_skill" name="reading_skill[]">\n' +
'<option value="1">&#xf006; &#xf006; &#xf006; &#xf006; &#xf005;</option>\n'+
'<option value="2">&#xf006; &#xf006; &#xf006; &#xf005; &#xf005;</option>\n'+
'<option value="3">&#xf006; &#xf006; &#xf005; &#xf005; &#xf005;</option>\n'+
'<option value="4">&#xf006; &#xf005; &#xf005; &#xf005; &#xf005;</option>\n'+
'<option value="5">&#xf005; &#xf005; &#xf005; &#xf005; &#xf005;</option>\n'+
'</select>\n' +
'</div>\n' +
'</div>\n' +
'<div class="col-md-3">\n' +
'<div class="form-group">\n' +
'<label for="writing_skill">writing_skill</label>\n' +
'<select class="form-control" id="writing_skill" name="writing_skill[]">\n' +
'<option value="1">&#xf006; &#xf006; &#xf006; &#xf006; &#xf005;</option>\n'+
'<option value="2">&#xf006; &#xf006; &#xf006; &#xf005; &#xf005;</option>\n'+
'<option value="3">&#xf006; &#xf006; &#xf005; &#xf005; &#xf005;</option>\n'+
'<option value="4">&#xf006; &#xf005; &#xf005; &#xf005; &#xf005;</option>\n'+
'<option value="5">&#xf005; &#xf005; &#xf005; &#xf005; &#xf005;</option>\n'+
'</select>\n' +
'</div>\n' +
'</div>\n' +
'<div class="col-md-3">\n' +
'<div class="form-group">\n' +
'<label for="listening_skill">listening_skill</label>\n' +
'<select class="form-control" id="listening_skill" name="listening_skill[]">\n'+
'<option value="1">&#xf006; &#xf006; &#xf006; &#xf006; &#xf005;</option>\n'+
'<option value="2">&#xf006; &#xf006; &#xf006; &#xf005; &#xf005;</option>\n'+
'<option value="3">&#xf006; &#xf006; &#xf005; &#xf005; &#xf005;</option>\n'+
'<option value="4">&#xf006; &#xf005; &#xf005; &#xf005; &#xf005;</option>\n'+
'<option value="5">&#xf005; &#xf005; &#xf005; &#xf005; &#xf005;</option>\n'+
'</select>\n' +
'</div>\n' +
'</div>\n' +
'</div>\n' +
'</div>';

When saving languages.

public function store(Request $request)
{
    foreach($request->language_id as $key => $language_id){
        $user->languages()->attach($language_id, ['reading_skill' => $request->reading_skill[$key]]);
        $user->languages()->attach($language_id, ['writing_skill' => $request->writing_skill[$key]]);
        $user->languages()->attach($language_id, ['reading_skill' => $request->reading_skill[$key]]);
    }
 }

I get this error

SQLSTATE[HY000]: General error: 1364 Field 'writing_skill' doesn't have a default value (SQL: insert into language_user (language_id, reading_skill, user_id) values (2, 3, 1))

    return redirect()->back();
0 likes
4 replies
automica's avatar

Had you added your ‘writing_skill’ to your fillable array?

shahr's avatar
Level 10

I added in LanguageUser model.

protected $fillable = [
    'reading_skill',
    'writing_skill',
    'listening_skill'
];

But my problem did not solve yet,

It showed the same error.

SQLSTATE[HY000]: General error: 1364 Field 'writing_skill' doesn't have a default value (SQL: insert into language_user (language_id, reading_skill, user_id) values (1, 3, 1))

shahr's avatar
Level 10

Can anyone answer my question?

MarianoMoreyra's avatar
Level 25

Hi @oxbir

You have 3 fields on your Pivot table, so, you have to pass those 3 fields to ONE attach method, instead of doing the attach three times like you are doing.

So, this should work:

public function store(Request $request)
{
    foreach($request->language_id as $key => $language_id){
        $user->languages()->attach($language_id, [
            'reading_skill' => $request->reading_skill[$key],
            'writing_skill' => $request->writing_skill[$key],
            'listening_skill' => $request->listening_skill[$key],
        ]);
    }
 }

Anyway, you may have something else that it might not be working, because you made nullable those fields at your migration, so you shouldn't be getting that error, although you should be ending up with 3 records, one per calification.

1 like

Please or to participate in this conversation.