php - 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();
}
}
有人可以帮忙吗?
提前致谢!
解决方案
我认为您需要更改复选框名称,如下所示
<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
推荐阅读
- datetime - 如何从 Java 中的字符串解析不同的日期格式(FAQ)
- swift - 推送到 git 后链接的框架和库变灰
- ios - 尝试在已经呈现的 VC 上呈现 VC (null)
- javascript - Cypress jS设置隐藏输入值
- autofac - 将 Autofac Ioc InstancePerHttpRequest 与 Servicestack 5.1.0 一起使用
- python - 错误:dockerfile 中的命令“bdist_wheel”无效
- swift - 添加了隐私密钥,但在关闭 UIImagePickerController 时仍然崩溃
- ubuntu - 如何杀死在 Windows、Linux 和 MacOS 中特定端口上运行的进程 - C# (.Net Core)
- tableview - JavaFX8 - 自定义的 EditCell 类 - 如何禁用 TableView 的鼠标单击,同时仍然允许在正在编辑的 TableCell 内单击?
- python - Keras 没有使用完整的 CPU 内核进行训练