Laravel关联表的多对多关系问题

时间:2018-06-05 06:34:33

标签: database laravel eloquent

我正在尝试为大学生构建一个应用程序。

我的想法是从数据库中检索数据,每个学生应该根据学生的学期显示课程。换句话说,如果学生A在第二学期,并且让我们说课程数据库仅在第二学期举行,对于学生A,我应该在页面上只有数据库作为符合条件的课程。

我有以下表格:

-users

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

-semester

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

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

-courses

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 :(得分:0)

我认为你不应该这样做。 你有学生表(用户)在这里 正如你所说:每个学生都应该根据学生所在的学期展示课程。

  

表示

     

学生必须在一个学期

     

课程必须与一个学期有关。

因此您只需要更改此表

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

关系应该是课程和学期之间的关系。 所以表格就像:

{{1}}

所以现在你有一个

   学生 属于 学期   和   你有学期 有很多 课程。

因此您可以将其转换为模型中的关系,而不是使用此函数showAll()。 希望它有所帮助。