Laravel具有多个列的枢轴

时间:2018-09-26 10:45:38

标签: laravel eloquent

嗨,我对Laravel的数据透视表有疑问。

我有下表:学生,课程和课程。

通过外键courses_id将表课程与课程联系起来,通过枢纽courses_students将表学生和课程联系起来。

所以我可以像这样通过学生访问信息:

//Students model
public function courses()
{
    return $this->belongsToMany(Courses::class,'courses_students','student_id', 'course_id')
        ->with('lessons');
}

//Courses model
public function lessons()
{
    return $this->hasMany(Lesson::class);
}

这对于这种关系完全正常,但是我想在数据透视表的教训表中添加第三列,其名称为lesson_id。

之所以这样做,是因为有时候我需要从每门课程中为每个用户获取一组特定的课程。

通过为数据透视表使用模型courseStudent成功做到了这一点。

使用数据透视模型,我的通话就变成了这样。

Student->with('courseStudent.courses')
    ->with('courseStudent.lessons')
    ->get();

这部分地满足了我的需要,但我想保持课程与学生之间的关系。

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:0)

docs中的示例(经过多对多):

return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');

数据透视表用于在两个实体上使用belongsToMany关系。 因此,如果您想在数据透视表之间使用雄辩的默认功能,则您的学生和课程应该定义好它。 另外请注意命名约定,因为这样可以减少最少的问题:数据透视表应为tableanamesingular_tablebnamesingular,其中顺序由表名称的字母顺序设置(即post_user是,{{ 1}}否)。 数据透视表中的ID字段应为user_post。 您可以根据需要设置名称,但是这样一来,您以后使用雄辩的行为就不会那么出乎意料。 documentation page中所有这些内容,我建议您仔细阅读。 另一种方法是使用动态属性来获取某些值。来自文档的示例:

tablenamesingular_id

如果要手动更改数据透视表中的值,则应为其创建单独的模型,该模型将与该实体/表关联(请注意,数据透视模型扩展了Pivot,例如来自docs而不是Model的示例):< / p>

$user = App\User::find(1);

foreach ($user->roles as $role) {
    echo $role->pivot->created_at;
}

答案 1 :(得分:0)

您可以将join用于第三个关系:

public function courses(){
    return $this->belongsToMany(Courses::class,'courses_students','student_id', 'course_id')
    ->withPivot('lesson_id')
    ->join('lessons','lesson_id','=','lessons.id')
    ->select('lessons.id','lessons.title', ...);
}

答案 2 :(得分:0)

如果您要在课程和课程中使用相同的数据透视表,则可以执行以下操作:

//Students model

public function courses()
{
    return $this->belongsToMany(Courses::class,'courses_students','student_id', 'course_id')
        ->whereNotNull('course_id');
}


public function lessons()
{
    return $this->belongsToMany(Lessons::class,'courses_students','student_id', 'lesson_id')
        ->whereNotNull('lesson_id');
}

然后使用它:

$courses = $student->courses;
$lessons = $student->lessons;