【问题标题】:Laravel eloquent: relationship between two owner of a tableLaravel 雄辩:表的两个所有者之间的关系
【发布时间】:2020-01-13 22:20:00
【问题描述】:

我有三个表StudentsCoursesGrades

而grade有两个外键:student_idcourse_id,属于两个表。

class Grade extends Model
{
    public function student()
    {
        return $this->belongsTo('App\Student');
    }
    public function course()
    {
        return $this->belongsTo('App\Course');
    }
}

另外,学生和课程有很多成绩:

class Student extends Model
{
    public function grades()
    {
        return $this->hasMany('App\Grade');
    }
}

class Course extends Model
{
    public function grades()
    {
        return $this->hasMany('App\Grade');
    }
}

现在,我想在学生和课程之间建立关系,例如,对于 student1,我想检索所有有成绩的课程。像这样,但它不正确:

$student1->grades->course

我可以简单地写

@foreach($student1->grades as $grade)
      $grade->course
@endforeach

但我不想要它,我希望在我的 foreach 循环中有 ($courses as $course)

【问题讨论】:

    标签: php laravel eloquent relationship


    【解决方案1】:

    我建议你需要参考https://laravel.com/docs/5.8/eloquent-relationships#has-many-through链接来实现这个,

    在学生模式中添加 hasManyThrough 关系。

    public function courses()
        {
            return $this->hasManyThrough(
                'App\Course',
                'App\Grade',
                'course_id', // Foreign key on Grade table...
                'id', // Foreign key on Course table...
                'id', // Local key on Student table...
                'student_id' // Local key on Grade table...
            );
        }
    

    我没有测试过这段代码,但这就是方式

    【讨论】:

      【解决方案2】:

      如何将成绩表设为数据透视表,以实现学生和课程之间的多对多关系。

      class Student
      {
          // an alternative name could be gradedCourses.
          public function courses()
          {
              return $this->belongsToMany(Course::class, 'grades');
          }
      }
      

      因此您可以直接通过这种关系访问课程。

      @foreach($student->courses course)
            $course->name
      @endforeach
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-06
        • 2018-07-24
        • 2019-07-01
        • 2015-03-07
        • 2020-07-23
        • 1970-01-01
        • 2018-04-24
        • 2016-09-06
        相关资源
        最近更新 更多