我正在建立一个用于大学管理的网站,教授可以登录该网站并为他们所教的学生分配分数。
我的数据库中有一个名为 “ IA_Marks” 的表:
|Student_ID|Subject_Code|Name|Marks1|Marks2|Marks3|Semester|Division|
在我的数据库中还有一个名为 “ Classroom_Mapper” 的表,该表可帮助将教授与主题映射到教室:
|Prof_ID|Subject_Code|Semester|Division|
这是我控制器中的一种方法:
public function showTable(){
$sem = DB::table('classroom_mappers')->where('Prof_ID', auth()->user()->PID)->pluck('semester');
$division = DB::table('classroom_mappers')->where('Prof_ID', auth()->user()->PID)->pluck('division');
$data = DB::table('iamarks')->where([['semester','=',$sem],['division','=',$division]])->get();
return view('ia',compact('data'));
}
使用此功能,我可以获取属于已登录教授的行。
但是,有一个问题。
假设教授在两个学期内教授两个科目。然后,where
子句将从映射器表返回多个结果。
例如:
select semester from classroom_mapper where Prof_ID=auth()->user()->Prof_ID
输出:
8
5
然后,第五学期和第八学期的学生将显示在他的仪表板上。我们的目标学期是5日。那会是个问题。
完成主题注册,如下所示: form screenshot
让我们将正在屏幕截图中注册的主题称为“ SUBJECT 4”。 这是第五学期A部的科目。
我想在仪表板上动态创建一个按钮(主题4),单击该按钮会将选择的学期(5)和除法(A)发送给控制器。 Dashboard Screenshot
该按钮将打开一个新创建的页面,其名称为subject(subject4.blade.php),其中将显示目标学期和部门(5和A)的数据库表内容。
如何使此动态视图创建按钮向控制器发送特定信息?甚至有可能吗?
答案 0 :(得分:1)
有几种方法可以使用Laravel进行此操作,但是我通常会为每个视图(仪表板,主题等)创建一个刀片模板,并可以动态填充该模板-假定每个主题的布局视图是相同的。
在仪表板视图中,您可以为每个按钮使用以下格式生成一个URL:http://cas.jce.in/subject/semester/5/division/a/
接下来,创建一条使用几个参数的路由,如下所示:
Route::get('/subject/semester/{semester_id}/division/{division_id}', 'ControllerName@showSubject');
此处有更多信息:https://laravel.com/docs/5.8/routing#required-parameters
然后在您的控制器中,添加一个showSemester函数,如下所示:
function showSubject($semester_id, $division_id){
$data = DB::table('table_name')->where('semester', '=', $semester_id)->where('division', '=', $division_id)->first();
return view('subject', ['data'=>$data, 'semester'=>$semester_id, 'division'=>$division_id]);
}
您的路径参数按外观顺序可用于控制器。因此,我们可以将$ semester_id和$ division_id添加为函数的前两个参数。接下来,在将所有内容返回到视图之前,我们将进行数据库工作以检索所需的数据。
请注意,此处我们使用的是单个视图,而不是动态选择一个视图。您可以为每个主题创建单独的视图,但是我想您可能不需要,除非每个主题的布局在某种程度上都是唯一的。在这种情况下,您可以简单地执行以下操作,但是我通常会尽量避免这样做。
$view = 'subject'.$data->subject_id;
return view($view, ['data'=>$data, 'semester'=>$semester_id, 'division'=>$division_id]);
此外,仅需简单说明一下...您可以考虑从上方调整数据库查询,以使用select语句而不是采摘。最终结果是相同的,但是使用select可以通过仅加载所需的数据来提高性能...而不是预先加载所有内容并将其大部分丢弃。
$sem = DB::table('classroom_mappers')->where('Prof_ID', Auth()->user()->PID)->pluck('semester');
...变成...
$sem = DB::table('classroom_mappers')->select('semester')->where('Prof_ID', auth()->user()->PID)->get();