【问题标题】:use laravel advanced where clauses to run a query使用 laravel 高级 where 子句运行查询
【发布时间】:2016-08-21 16:27:30
【问题描述】:

假设我有一个像这样的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 关系。

UserCourse 名为 ~course_user` 的数据透视表有这些字段:

course_id
user_id

另一方面,UserLesson 之间存在多对多关系。那些名为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 子句)获取用户课程并计算每门课程中通过课程的百分比。

【问题讨论】:

  • 请分享您的迁移和虚拟数据,让我们更容易测试

标签: php mysql sql laravel


【解决方案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; 
    //...
}

【讨论】:

  • ,我尝试了你的解决方案,但这并不是我想要的。但这对我很有用,并给了我解决这个问题的想法。您可以查看我的答案来比较我的解决方案和您自己。
【解决方案2】:

在@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;
        });

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    相关资源
    最近更新 更多