关联查询拆分后的操作

关联查询拆分后,要把数据重新组合在一起,我们不能相信返回的顺序是一致的,因为本人踩过这种坑,不能按照顺序去匹配数据,一般来说,会根据关联的条件去作为判断的根据,这样子的话就要使用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;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值