关联查询拆分后,要把数据重新组合在一起,我们不能相信返回的顺序是一致的,因为本人踩过这种坑,不能按照顺序去匹配数据,一般来说,会根据关联的条件去作为判断的根据,这样子的话就要使用foreach循环,如果关联条件是多个的话,可能要嵌套循环,这样的话会很慢,所以使用以下小技巧
public static function exportAllDetail(int $subject_id)
{
$sql = " ";
$result = DB::select($sql,[
'subject_id' => $subject_id
]);
// dump($result);
// $de = Db::table('dimension_results')
// ->where('user_id',1002)
// ->where('subject_id',7)
// ->get();
// dump($de);die;
$user_ids = array_column($result,'id');
$dim_ids = array_column($result,'dim_id');
// dump($dim_ids);die;
$res_ids = array_unique(array_column($result,'res_id'));
// dump($user_ids);die;
// dump(array_unique($user_ids));die;
$user_id =array_unique($user_ids);
$dimension_id =array(array_unique($dim_ids));
// dump($dimension_id[0]);die;
$dres = Db::table('dimension_results')
->selectRaw('total_score as dim_total_score,dimension_id,user_id')
->where('subject_id',7)
->whereIn('user_id',$user_id)
// ->whereIn('dimension_id',$dimension_id[0])
->whereIn('result_id',$res_ids)
->groupBy('user_id')
->groupBy('result_id')
->groupBy('dimension_id')
->get()
->toArray();
// dump($dres);die;
$a = [];
foreach ($result as $key => $r){
$r->index = $r->id.'_'.$r->dim_id;
}
foreach ($dres as $key =>$d){
$d->index = $d->user_id.'_'.$d->dimension_id;
}
// $index_id1 = array_column($result,'index');
$index_id2 = array_column($dres,'index');
$all = [];
foreach ($result as $k =>$r) {
$index = array_search($r->index, $index_id2);
if ($index >= 0 && $index !== false) {
$a = json_decode(json_encode(array_merge(json_decode(json_encode($r), true), json_decode(json_encode($dres[$index]), true))));
array_push($all, $a);
}
}
return $all;
}