Используя фреймворк Laravel построитель запросов способ, при котором() с подзапросом


Я разрабатываю веб-приложение, используя Laravel 5.3. Теперь у меня проблема с Laravel query builder method, where. Вот мой сценарий:

У меня есть такая таблица.

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

Что я хочу сделать, так это заставить студентов искать по course_id таблицы student_course, не присоединяясь ни к одной таблице. В ручном запросе мне это нравится.

SELECT * FROM `student` WHERE `student`.`id` IN (SELECT `student_id` FROM `student_course` WHRE `course_id`= ?) 
Поэтому теперь, когда я пытаюсь преобразовать его в Laravel query builder, у меня возникает проблема. Вот мой код:
DB::table('student')->whereIn('id',[ "Here I want to run sub query" ])->get();

Как вы можете смотрите во втором параметре where (), я получаю проблему. В этом случае нужно ли запускать необработанный запрос? Как выполнить необработанный запрос в качестве второго параметра? Если нет, то как я могу фильтровать по course_id только в одном запросе, как выше, и не присоединяться ни к одной таблице, пожалуйста?

3 2

3 ответа:

См. это

 $courseId = 1;

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

Вы можете сделать это:

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

Если вы хотите пройти через модель, вы можете использовать:

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