After login a user, The user enters this skills form, selects the skills.
A user can enter multiple skills, and save in database.
The field of name
And in table
I don't know if the skills
and skill_user
table should be, or not, I don't know.
What would you do if you were me?
Can you show me the cleanest coding?
public function up()
{
Schema::create('skills', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->string('skill_name');
$table->smallInteger('level');
$table->timestamps();
});
Schema::create('skill_user', function (Blueprint $table) {
$table->bigInteger('skill_id')->unsigned()->nullable();
$table->foreign('skill_id')->references('id')->on('skills')->onDelete('cascade');
$table->bigInteger('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->unique(['skill_id' , 'user_id']);
});
}
blade
showDynamicExperimental();
function showDynamicExperimental()
{
let html = '' +
'@foreach(auth()->user()->skills as $skill)\n'+
'<div class="col-md-6 position-relative">\n' +
'<i class="fas fa-times text-danger position-absolute"></i>' +
'<div class="row">\n' +
'<div class="col-md-8">\n' +
'<div class="form-group">\n' +
'<label for="skill_name">skill_name</label>\n' +
'<input type="text" id="skill_name" name="skill_name[]" class="form-control" value="{{ $skill->skill_name }}">\n' +
'</div>\n' +
'</div>\n' +
'<div class="col-md-4">\n' +
'<div class="form-group">\n' +
'<label for="level">level</label>\n' +
'<select class="form-control" id="level" name="level[]">\n' +
'<option value="1" {{ $skill->level == 1 ? 'selected' : '' }}>★☆☆☆☆</option>\n'+
'<option value="2" {{ $skill->level == 2 ? 'selected' : '' }}>★★☆☆☆</option>\n'+
'<option value="3" {{ $skill->level == 3 ? 'selected' : '' }}>★★★☆☆</option>\n'+
'<option value="4" {{ $skill->level == 4 ? 'selected' : '' }}>★★★★☆</option>\n'+
'<option value="5" {{ $skill->level == 5 ? 'selected' : '' }}>★★★★★</option>\n'+
'</select>\n'+
'</div>\n' +
'</div>\n' +
'</div>\n' +
'</div>\n ' +
'@endforeach';
$('#showExperimental').append(html);
}
Controller
$user->skills()->detach();
if ($request->skill_name) {
foreach ($request->skill_name as $key => $value) {
$user->skills()->attach($value, [
'user_id' => auth()->id(),
'level' => $request->level[$key],
]);
}
}
User.php
public function skills()
{
return $this->belongsToMany(Skill::class)->withPivot('skill_name');
}
I get this error.
It seems that there isn't a level
column in the skill_user
table.
I think the skill
table should just store the id and skill name.
Then you add the level
column in the skill_user
and use skill_id
and level
to track the user level.