【问题标题】:Using Laravel query builder method whereIn() with sub query使用 Laravel 查询构建器方法 whereIn() 和子查询
【发布时间】:2017-04-13 02:46:31
【问题描述】:

我正在使用 Laravel 5.3 开发一个 Web 应用程序。我现在遇到了 Laravel 查询构建器方法的问题,whereIn

我有这样的桌子。

student - id, name, dob
course - id, code
student_course -  student_id, course_id

我想要做的是让学生通过 student_course 表的course_id 搜索而不加入任何表。在手动查询中,我确实喜欢这样。

SELECT * FROM `student` WHERE `student`.`id` IN (SELECT `student_id` FROM `student_course` WHRE `course_id`= ?) 

所以现在当我尝试将其转换为 Laravel 查询构建器时,我遇到了问题。这是我的代码:

DB::table('student')->whereIn('id',[ "Here I want to run sub query" ])->get();

正如您在whereIn() 的第二个参数中看到的,我遇到了问题。在这种情况下,我需要运行原始查询吗?如何将原始查询作为第二个参数运行?如果没有,我如何仅在一个查询中按course_id 过滤而不加入任何表?

【问题讨论】:

标签: mysql laravel where-in laravel-query-builder


【解决方案1】:

参考这个

 $courseId = 1;

 $data = DB::table('student')->whereIn('id',function($query) use (courseId){
    $query->select('student_id')
            ->from('student_course')->where('course_id', '=',$courseId);
})->get();

【讨论】:

  • 值得注意——如果你在子查询中不使用from(...),它会查询同一张表。所以在这种情况下$query->from('student_course')...
【解决方案2】:

如果你想通过模型,你可以使用:

$res = Student::whereIn('id',StudentCourse::where('course_id',$course_id)->pluck('student_id')->toArray())->get();

【讨论】:

    【解决方案3】:

    你可以这样做:

    DB::table('student')
        ->whereRaw("id IN (SELECT `student_id` FROM `student_course` WHERE `course_id`= ?)", [$course_id])
        ->get();
    

    【讨论】:

      【解决方案4】:

      谁使用查询生成器:

      $data = DB::table('student')
      ->whereIn('id',DB::table('student_course')
      ->where('course_id','=',$courseId)
      ->pluck('student_id')
      ->toArray())
      ->get();
      

      【讨论】:

        猜你喜欢
        • 2015-07-06
        • 1970-01-01
        • 2019-01-18
        • 1970-01-01
        • 2019-12-25
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多