嗨,我对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();
这部分地满足了我的需要,但我想保持课程与学生之间的关系。
有没有办法做到这一点?
答案 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;