2015-08-13 4 views
1

У меня есть база данных со столами: вопросы, ответы, ответы и респонденты. У вопросов есть ответы, которые имеют ответы, которые принадлежат респонденту (у респондентов может быть много ответов).Eloquent WhereHas With Несколько вложенных элементов из массива

Я пытаюсь сделать корреляции, обнуляя все ответы на вопросы, связанные с респондентами, которые выбрали определенный ответ на вопрос. Итак, что еще ответили люди, которые отвечали, что им было 18-20 лет.

Фокус в том, что я хочу сделать это через нескольких респондентов и несколько ответов. Например, что еще люди, которые составляют 18-20 лет, и, как и цвет зеленый, такие как:

В настоящее время у меня это работает «или», когда каждый дополнительный answer_id я добавляю вытягивание респондентов, которые выбрали одну из два ответа:

$cFilters = array() of answer_ids; 
$respondents = Auth::user()->account->respondents() 
       ->whereHas('responses', function($q) use($cFilters) { 
        $q->whereIn('responses.answer_id', $cFilters); 
       })->get(); 

Я бы в конечном счете, хотел, чтобы они, работающие в «и» моды, где добавление в другом answer_id показывает только респонденты, которые выбрали оба ответа, выявленных answer_ids, не вполне может понять, что один вне. Вот то, что я пытался до сих пор, что не вызывает ошибки, но и, кажется, не работать правильно:

$cFilters = array() of answer_ids; 
$respondents = Auth::user()->account->respondents() 
       ->whereHas('responses', function($q) use($cFilters) { 
        foreach($cFilters as $answer_id) { 
         $q->where('responses.answer_id', $answer_id); 
        } 
       })->get(); 

ответ

0

мне пришлось прибегнуть к сырому SQL, но это работает:

$query = 'SELECT * FROM respondents 
       WHERE id IN ('; 

     $i = 1; 
     foreach($cFilters as $answer_id) { 
      $query = $query . 'SELECT respondent_id FROM responses WHERE answer_id=' . $answer_id; 
      if($i < count($cFilters)) { 
       $query = $query . ') AND id IN ('; 
      } 
      $i++; 
     } 
     $query = $query . ')'; 

     $respondents = DB::select(DB::raw($query)); 
Смежные вопросы