Laravel: Как динамически создавать и называть представления? - PullRequest
1 голос
/ 26 марта 2019

Я создаю веб-сайт для администрации колледжа, где профессора входят в систему и выставляют оценки студентам, которых они преподают.

В моей базе данных есть таблица с именем "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-го и 8-го семестра будут показаны на его панели инструментов. Наш целевой семестр был, скажем, 5-м. Тогда это будет проблемой.

Регистрация по теме, производится как показано здесь: скриншот формы

Давайте назовем объект, зарегистрированный на скриншоте, "SUBJECT 4" Это предмет для 5 семестра, раздел А.

Я хочу динамически создать кнопку (SUBJECT 4) на панели инструментов, которая при нажатии отправляет выбранный семестр (5) и деление (A) на контроллер. Снимок экрана панели инструментов

Эта кнопка должна открыть вновь созданную страницу с именем субъекта (subject4.blade.php), где будет показано содержимое таблицы базы данных для целевого семестра и подразделения (5 и А).

Как мне сделать эту кнопку создания динамического представления, которая посылает конкретную информацию в контроллер? Это вообще возможно?

1 Ответ

1 голос
/ 26 марта 2019

Есть несколько способов сделать это с 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]);

Кроме того, просто быстрое примечание ... вы можете подумать о том, чтобы настроить запросы к вашей базе данных сверху, чтобы использовать оператор выбора, а не pluck. Конечный результат тот же, но использование выбора может повысить производительность, загружая только те данные, которые вам нужны ... вместо того, чтобы загружать все заранее и выбрасывать большую часть.

$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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...