Laravel:如何动态创建和命名视图?

时间:2019-03-26 18:28:18

标签: php mysql laravel laravel-5.8

我正在建立一个用于大学管理的网站,教授可以登录该网站并为他们所教的学生分配分数。

我的数据库中有一个名为 “ 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)的数据库表内容。

如何使此动态视图创建按钮向控制器发送特定信息?甚至有可能吗?

1 个答案:

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