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();