2015-06-29 206 views
0

我得到了一个调查表的设置,每个调查都有一些与自身相关的答案(一对多)。我想做一个查询来计算每个surveyId的答案数分别为parameter1 = 0和parameter1 = 1。合并两个Eloquent集合

我试着这样做:

$surveysWithRepliesExposed = Survey::where('title', 'LIKE', "%$name%") 
    ->with(array('surveyAnswerSets' => function($query){ 
     $query->where('parameter1', 0) 
     ->selectRaw('surveyId, count(*) as repliesExposed') 
     ->groupBy('surveyId'); 
    })) 
    ->select($columns); 

$surveysWithRepliesExposed = Survey::where('title', 'LIKE', "%$name%") 
    ->with(array('surveyAnswerSets' => function($query){ 
     $query->where('parameter1', 1) 
     ->selectRaw('surveyId, count(*) as repliesControl') 
     ->groupBy('surveyId'); 
    })) 
    ->select($columns); 

但现在我得到的外观几乎相同的两个集合:

{ 
    "surveyId": 11, 
    "title": "A survey", 
    "startDate": "2015-04-16", 
    "endDate": "2015-04-30", 
    "survey_answer_sets": [ 
     { 
      "surveyId": 11, 
      "repliesExposed": 212 
     } 
    ] 
} 

而其他

{ 
    "surveyId": 11, 
    "title": "A survey", 
    "startDate": "2015-04-16", 
    "endDate": "2015-04-30", 
    "survey_answer_sets": [ 
     { 
      "surveyId": 11, 
      "repliesControl": 56 
     } 
    ] 
} 

如何合并这些让我得到

{ 
    "surveyId": 11, 
    "title": "A survey", 
    "startDate": "2015-04-16", 
    "endDate": "2015-04-30", 
    "survey_answer_sets": [ 
     { 
      "surveyId": 11, 
      "repliesExposed": 212 
      "repliesControl": 56 
     } 
    ] 
} 

回答

0

我在朋友的帮助下解决了这个问题。

此代码做我想要的!

$surveys = Survey::leftJoin('SurveyAnswerSets', 'Surveys.surveyId', '=', 'SurveyAnswerSets.surveyId') 
    ->select(
     DB::raw(
      "Surveys.surveyId, 
      Surveys.title, 
      Surveys.startDate, 
      Surveys.endDate, 
      sum(case when SurveyAnswerSets.isRefGroup = 0 then 1 else 0 end) repliesExposed, 
      sum(case when SurveyAnswerSets.isRefGroup = 1 then 1 else 0 end) repliesControl, 
      sum(1) repliesTotal" 
     ) 
    ) 
    ->where('SurveyAnswerSets.isComplete', 1) 
    ->where('Surveys.title', 'LIKE', "%$name%") 
    ->where('Surveys.isTemplate', 0) 
    ->groupBy('Surveys.surveyId')->get();