Laravel Вопрос соединения таблиц между многими - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь создать приложение для студентов вузов.

Моя идея - извлечь данные из базы данных, где для каждого студента должны отображаться курсы в зависимости от того, в каком семестре студент находится.Другими словами, если студент А находится во втором семестре и, скажем, курс «Базы данных» проводится только во втором семестре, для студента ИИ должен иметь на странице только «Базы данных» как приемлемый курс.

У меня есть следующие таблицы:

-пользователи

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

-семестр

public function up()
{
    Schema::create('semesters', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('number');
        $table->timestamps();
    });
}

extra_info_students

public function up()
{
    Schema::create('additional_info_students', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('first_name', 255);
        $table->string('last_name', 255);
        $table->integer('faculty_number')->unique();        
        $table->integer('group_number');
        $table->integer('year');
        $table->integer('semester_id')->unsigned();
        $table->foreign('semester_id')->references('id')->on('semesters');
        $table->timestamps();
    });
}

-курсы

public function up()
{
    Schema::create('courses', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name', 255);
        $table->string('language', 10);
        $table->longText('description', 30000000);
        $table->integer('semester_id')->unsigned();
        $table->foreign('semester_id')->references('id')->on('semesters');
        $table->timestamps();
    });
}

-courses_assign_students

public function up()
{
    Schema::create('courses_assign_students', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('student_id')->unsigned();
        $table->foreign('student_id')->references('user_id')->on('additional_info_students');
        $table->integer('courses_id')->unsigned();
        $table->foreign('courses_id')->references('id')->on('courses');
        $table->timestamps();
    });     
}

Будет ли это работать?Кажется, я не могу присоединиться к ним правильно, чтобы получить то, что мне нужно.

Более того, когда я присоединяюсь к таблицам и пытаюсь распечатать свойство из коллекции, например student_id, я получаю сообщение об ошибке неопределенного свойства.

public function showAll() {
    $courses = CoursesAssignStudents::join('courses', 'courses_assign_students.courses_id', '=', 'courses.id')
                       ->join('additional_info_students', 'courses_assign_students.student_id', '=', 'additional_info_students.user_id')
                       ->select('courses.*','additional_info_students.user_id as student_id', 'first_name', 'last_name', 'faculty_number','group_number','year','additional_info_students.semester_id as sem_id')->get();

    return view('courses', compact('courses'));
}

Также, передавая данные в представлении, я зацикливаюсь на курсах и получаю один и тот же курс дважды, когда мне нужно его получить один раз.

Наконец, я использую Laravel 5.4

Буду очень признателен за вашу помощь!

Заранее спасибо :)

1 Ответ

0 голосов
/ 05 июня 2018

Я думаю, вы не должны делать это так.у вас есть таблица студентов (пользователи) здесь и как вы сказали: у каждого студента должны быть показаны курсы в зависимости от того, в каком семестре учится студент.

, что означает

Студент должен быть всеместр

Курсы должны быть связаны с семестром.

, поэтому вам нужно только изменить эту таблицу

public function up()
{
    Schema::create('courses_assign_students', function (Blueprint $table) {
       $table->increments('id');
       $table->integer('student_id')->unsigned();
       $table->foreign('student_id')->references('user_id')->on('additional_info_students');
       $table->integer('courses_id')->unsigned();
       $table->foreign('courses_id')->references('id')->on('courses');
       $table->timestamps();
     });     
}

Соотношение должно быть между курсами и семестрами.поэтому таблица будет выглядеть следующим образом:

public function up()
{
    Schema::create('course_semester', function (Blueprint $table) {
       $table->increments('id');
       $table->integer('semester_id')->unsigned();
       $table->foreign('semester_id')->references('id')->on('semesters');
       $table->integer('courses_id')->unsigned();
       $table->foreign('courses_id')->references('id')->on('courses');
       $table->timestamps();
     });     
}

так что теперь у вас есть

студент , который принадлежит к семестр и у вас есть семестр , который имеет множество курсов.

, так что вы можете перевести это на отношения в модели вместо использования этой функции showAll ().Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...