2016-11-29 3 views
2

Я разрабатываю веб-приложение с использованием Laravel 5.3. У меня возникла проблема с методом построителя запросов Laravel, гдеIn. Вот мой сценарий:Использование метода построителя запросов Laravel whereIn() с дополнительным запросом

У меня есть таблица вроде этого.

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, у меня есть проблема. Вот мой код:

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

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

+1

Возможно отношение: HTTP: // StackOverflow .com/questions/16815551/how-to-do-this-in-laravel-subquery-where-in –

+0

Да, эта ссылка решила мою проблему. Спасибо. –

ответ

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(); 
+0

стоит отметить - если вы не используете 'from (...)' в подзапросе, он будет запрашивать ту же таблицу. Поэтому в этом случае '$ query-> from ('student_course') ...' –

+0

попытается использовать отредактированный –

0

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

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

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

$res = Student::whereIn('id',StudentCourse::where('course_id',$course_id)->pluck('student_id')->toArray())->get(); 
Смежные вопросы