首页 > 解决方案 > Laravel 8.x - 表单复选框到数据透视表

问题描述

我正在建立一个学生可以申请学术课程的平台。学生使用表格提供一些个人信息,然后选择至少一门课程来申请。

发送表单时,ApplicationsController验证输入并检查是否至少检查了一门课程。控制器:_

public function student_store(Request $request, Course $course)
{

    $request->validate([

        'fname' => 'required|string|min:2|max:40',
        'lname' => 'required|string|min:2|max:40',
        'email' => 'required|email|min:6|max:254',
        'course-check' => 'required', 
        'phone' => 'required|digits:10',
        'created_at' =>  \Carbon\Carbon::now(), 
        'updated_at' => \Carbon\Carbon::now(),  
    
    ]);

如果验证正常,Applicant则使用表单输入在数据库中创建一个新的:

    $input = $request->all();
    Applicant::create($input);

然而,目标是在数据透视表中创建一个或多个新实例applicant_course,具体取决于学生选择了哪一门或多门课程。到目前为止,我有这个:

          $applicant = Applicant::where('fname', $input['fname'] )
                                ->where('lname', $input['lname'] )
                                ->where('email', $input['email'] )
                                ->latest()->first();

          $checkboxes = $request->all('course-check');
          foreach ($checkboxes as $checkbox){
              $applicant->courses()->where('course_id', $checkbox)->attach($course->id);
          }
}

但是,控制器功能所做的只是验证输入并Applicant使用它们的数据在数据库中创建一个新的,但在数据透视表中没有添加任何内容。

这是视图结构(忽略$program变量):

@foreach ($courses as $course)
@if ($course->program_id == $program->id)
<div class="course course-{{$program->id}}-{{$course->id}}">
    <div class="course-header">
        <label class="course-number" for="course-check-{{$program->id}}-{{$course->id}}">{{$program->id}}0{{$course->id}}0</label>
        <label class="course-title" for="course-check-{{$program->id}}-{{$course->id}}">{{$course->title}}</label>                                            
        <input type="checkbox" name="course-check[{{ $course->id }}]" class="course-check" id="course-check-{{$program->id}}-{{$course->id}}" value="" >
    </div>
</div>
@endif
@endforeach

这是Applicant 模型

class Applicant extends Model
{
    use HasFactory;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'fname',
        'lname',
        'email',
        'phone',
    ];

    public function courses()
    {
        return $this->belongsToMany(Course::class)->withTimestamps();
    }
}

有人可以帮忙吗?

提前致谢!

标签: phphtmllaraveleloquent

解决方案


我认为您需要更改复选框名称,如下所示

<input type="checkbox" name="course-check[]" class="course-check" id="course-check-{{$program->id}}-{{$course->id}}" value="{{ $course->id }}" >

然后在控制器中

$checkboxes = $request->get('course-check');
$applicant->courses()->sync($checkboxes);

或者

$checkboxes = $request->get('course-check');
$applicant->courses()->attach($checkboxes);

了解附加和同步之间的区别

参考:https ://laravel.com/docs/8.x/eloquent-relationships#updating-many-to-many-relationships


推荐阅读