使用 Laravel 查询构建器方法 whereIn() 和子查询
Posted
技术标签:
【中文标题】使用 Laravel 查询构建器方法 whereIn() 和子查询【英文标题】:Using Laravel query builder method whereIn() with sub query 【发布时间】: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
过滤而不加入任何表?
【问题讨论】:
可能相关:***.com/questions/16815551/… 是的,该链接解决了我的问题。非常感谢。 【参考方案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();
【讨论】:
以上是关于使用 Laravel 查询构建器方法 whereIn() 和子查询的主要内容,如果未能解决你的问题,请参考以下文章
将带有变量的闭包传递给 Laravel 查询构建器中的 where 方法