使用laravel advanced where子句来运行查询

时间:2016-08-18 12:09:03

标签: php mysql sql laravel

假设我有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

如您所见,CourseLesson之间存在OneToMany关系,UserCourse之间存在ManyToMany关系。

User Course名为〜course_user`的数据透视表包含以下字段:

course_id
user_id

另一方面,UserLesson之间存在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子句中。

2 个答案:

答案 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;
        });