假设我有Course
这样的模型:
class Course extends Model
{
public function users ()
{
return $this->belongsToMany('App\User', 'course_user', 'course_id', 'user_id');
}
public function lessons ()
{
return $this->hasMany('App\Lesson', 'course_id', 'course_id');
}
}
Course
字段为:
course_id
title
每门课程都可以有多节课。
Lesson
模型就像:
class Lesson extends Model
{
public function course ()
{
return $this->belongsTo('App\Course', 'course_id', 'course_id');
}
public function users ()
{
return $this->belongsToMany('App\User', 'lesson_user', 'lesson_id', 'user_id');
}
}
它的领域是:
lesson_id
title
course_id
如您所见,Course
和Lesson
之间存在OneToMany关系,User
和Course
之间存在ManyToMany关系。
User
Course
名为〜course_user`的数据透视表包含以下字段:
course_id
user_id
另一方面,User
和Lesson
之间存在ManyToMany关系。名为lesson_user
的人的数据透视表,并包含以下字段:
lesson_id
user_id
passed
passed
字段显示课程中用户的状态。如果它是0,意味着用户还没有通过它,否则他通过它。
User
模型就像:
class User extends Model
{
public function lessons()
{
return $this->belongsToMany('App\Lesson', 'lesson_user', 'user_id', 'lesson_id')
}
public function courses ()
{
return $this->belongsToMany('App\Course', 'course_user', 'user_id', 'course_id');
}
}
现在我希望通过最佳方式获取用户课程并计算每门课程中通过课程的百分比,例如嵌套在where子句中。
答案 0 :(得分:1)
我认为这可能不是最好的方法。但它易于理解和维护
$courses = $user->courses->map(function($cource){
$all_lessions = $cource->pivot->count();
$done_lessions = $cource->pivot->where(passed,'<>',0)->count();
$percent = $done_lessions * 100 / $all_lessions;
return $cource->push(['percent'=>$percent]);
});
现在您可以通过
访问foreach ($courses as $cource){
$cource->percent;
$cource->title;
//...
}
答案 1 :(得分:1)
从@KmasterYC回答的灵感,我写下了以下代码和所有工作:
$userCourses =
$currentUser->courses()
->take(3)
->get();
$userCourses->map(function ($course) use ($currentUser) {
$allLessonsCount = $course->lessons->count();
$courseLessonID = $course->lessons->lists('lesson_id')->toArray();
$userLessonsCount = $currentUser->lessons()
->where('passed', '=', true)
->whereIn('lesson_user.lesson_id', $courseLessonID)
->count();
$percent = round($userLessonsCount * 100 / $allLessonsCount);
$course['percent'] = $percent;
});