Laravel: 如何动态创建和命名视图?
Laravel: How to dynamically create and name views?
我正在制作一个大学管理网站,教授可以登录该网站并为他们所教的学生打分。
我的数据库中有一个 table,名为 "IA_Marks":
|Student_ID|Subject_Code|Name|Marks1|Marks2|Marks3|Semester|Division|
我的数据库中还有一个名为 "Classroom_Mapper" 的 table,它有助于将教授映射到课堂,主题:
|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
子句将 return 来自映射器 table 的多个结果。
例如:
select semester from classroom_mapper where Prof_ID=auth()->user()->Prof_ID
输出:
8
5
然后第 5 和第 8 学期的学生将显示在他的仪表板上。我们的目标学期是,比如第 5 学期。那就麻烦了。
注册主题,如下所示:
form screenshot
让我们将屏幕截图中正在注册的主题称为"SUBJECT 4"。
是第五学期A部的科目
我想在仪表板上动态制作一个按钮(主题 4),单击该按钮后,会将选择的学期(5)和分区(A)发送到控制器。
Dashboard Screenshot
此按钮应打开一个带有主题名称(subject4.blade.php) 的新建页面,其中将显示目标学期和分部(5 和 A) 的数据库table 内容。
我如何制作这个动态视图创建按钮,将特定信息发送到控制器?有可能吗?
使用 Laravel 有几种方法可以做到这一点,但我通常是为每个视图(仪表板、主题等)创建一个单独的 blade 模板,可以动态populated -- 假设每个主题视图的布局相同。
在您的仪表板视图中,您可以为每个使用如下格式的按钮生成一个 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 作为我们函数的前两个参数。接下来,在将所有内容返回到视图之前,我们将使用数据库检索我们需要的数据。
请注意,我们使用的是单一视图,而不是动态 selecting 视图。您可以为每个主题创建单独的视图,但我认为您可能不需要这样做,除非每个主题的布局在某种程度上是独一无二的。在那种情况下,你可以简单地做这样的事情,但我通常会尽量避免它。
$view = 'subject'.$data->subject_id;
return view($view, ['data'=>$data, 'semester'=>$semester_id, 'division'=>$division_id]);
此外,只是一个简短的说明......您可以考虑从上面调整您的数据库查询以使用 select 语句而不是 pluck。最终结果是一样的,但是使用 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();
我正在制作一个大学管理网站,教授可以登录该网站并为他们所教的学生打分。
我的数据库中有一个 table,名为 "IA_Marks":
|Student_ID|Subject_Code|Name|Marks1|Marks2|Marks3|Semester|Division|
我的数据库中还有一个名为 "Classroom_Mapper" 的 table,它有助于将教授映射到课堂,主题:
|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
子句将 return 来自映射器 table 的多个结果。
例如:
select semester from classroom_mapper where Prof_ID=auth()->user()->Prof_ID
输出:
8
5
然后第 5 和第 8 学期的学生将显示在他的仪表板上。我们的目标学期是,比如第 5 学期。那就麻烦了。
注册主题,如下所示: form screenshot
让我们将屏幕截图中正在注册的主题称为"SUBJECT 4"。 是第五学期A部的科目
我想在仪表板上动态制作一个按钮(主题 4),单击该按钮后,会将选择的学期(5)和分区(A)发送到控制器。 Dashboard Screenshot
此按钮应打开一个带有主题名称(subject4.blade.php) 的新建页面,其中将显示目标学期和分部(5 和 A) 的数据库table 内容。
我如何制作这个动态视图创建按钮,将特定信息发送到控制器?有可能吗?
使用 Laravel 有几种方法可以做到这一点,但我通常是为每个视图(仪表板、主题等)创建一个单独的 blade 模板,可以动态populated -- 假设每个主题视图的布局相同。
在您的仪表板视图中,您可以为每个使用如下格式的按钮生成一个 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 作为我们函数的前两个参数。接下来,在将所有内容返回到视图之前,我们将使用数据库检索我们需要的数据。
请注意,我们使用的是单一视图,而不是动态 selecting 视图。您可以为每个主题创建单独的视图,但我认为您可能不需要这样做,除非每个主题的布局在某种程度上是独一无二的。在那种情况下,你可以简单地做这样的事情,但我通常会尽量避免它。
$view = 'subject'.$data->subject_id;
return view($view, ['data'=>$data, 'semester'=>$semester_id, 'division'=>$division_id]);
此外,只是一个简短的说明......您可以考虑从上面调整您的数据库查询以使用 select 语句而不是 pluck。最终结果是一样的,但是使用 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();