laravel5.1 子查詢(Query_Builder)

laravel 5.1 子查詢實例

原生SQL:


select count(uid) as onl,date_format(time,'%H') as hour from `d_user_login201705` where `id` in (select min(id) as mid from `d_user_login201705` where `type` = '0' and `time` >= '2017-05-10 00:00:00' and `time` <= '2017-05-10 23:59:59' group by `uid`) group by `hour`


在laravel5.1  中應該怎麼書寫呢???   

參考文章   子查詢列子

源碼方法:點擊打開鏈接         

$previous = DB::connection('log')
                         ->table($table_prefix.$start_table)
                         ->select(DB::raw("count(uid) as onl,date_format(time,'%H') as hour"))
                                                                //方法外引用變量
                         ->whereIn('id',function($query) use ($table_prefix,$start_table,$start_time,$end_time){
                                 $song = DB::connection('log')
                                         ->table($table_prefix.$start_table)
                                         ->where('type','=','0')
                                         ->where('time','>=',date('Y-m-d 00:00:00',$start_time))
                                         ->where('time','<=',date('Y-m-d 23:59:59',$start_time))
                                         ->select(DB::raw("min(id) as mid"))
                                         ->groupBy('uid');
                                 $song_str = $song->toSql(); //獲取原生sql 語句
                                 //結果  select min(id) as mid from `d_user_login201705` where `type` = ? and `time` >= ? and `time` <= ? group by `uid`
                                 $song_val = $song->getBindings(); 
              //變量被?號代替的值(laravel 底層方法) 結果 Array(    [0] => 0    [1] => 2017-05-10 00:00:00    [2] => 2017-05-10 23:59:59)
                                 $song_result =self::getStringReplace($song_val,$song_str) ;  //將獲取值與?替換
                                 $query->select('mid')->from(DB::raw("($song_result) as tmp"));
                                            })
                         ->groupBy('hour')
                         ->get();


from 字查詢案例

 /**
     * 周活(登錄表)
     * @param Request $request
     * @return $this
     */
    public function weekKeepView(Request $request){
        set_time_limit(0);
        $data['start_time'] = $request->input('start_time',date('Y-m-d',strtotime('-14 days')));
        $data['end_time'] = $request->input('end_time',date('Y-m-d'));
        $start_time = strtotime($data['start_time']);
        $end_time  = strtotime($data['end_time']);
        //讀取文件
        $file_name = 'weekData.json';
        $week_data = Storage::disk('local')->exists($file_name) ? json_decode(Storage::get($file_name),true) : [];
        $week_data_day = count($week_data)>0 ? array_column($week_data,'day') : [];
        //循環查詢時間區間
        for($i=$start_time,$select_day=[];$i<=$end_time;$i+=86400){
            $select_day[] =  intval(date('Ymd',$i));
        }
        //求出差集
        $need_select_day = array_diff($select_day,$week_data_day);
        //循環執行語句查詢
        if(count($need_select_day)>0){
            $res = [];
            foreach($need_select_day as $key=>$val){
                $self_time = strtotime($val);
                $self_start_time = date('Ymd',$self_time-86400*6);
                $self_end_time = date('Ymd',$self_time+86400);
                if(substr($self_start_time,0,6)==substr($self_end_time,0,6)){
                    $res[$key] = DB::connection('log')->table('d_user_login'.substr($val,0,6))
                        ->select(DB::raw("count(distinct(uid)) as total"))
                        ->where('type','=',0)
                        ->whereBetween('time',[$self_start_time,$self_end_time])
                        ->lists('total');
                }else{
                    $sql = DB::connection('log')->table('d_user_login'.substr($self_start_time,0,6))
                           ->select('uid')->where('type','=',0)
                           ->whereBetween('time',[$self_start_time,$self_end_time])
                           ->union(
                               DB::connection('log')->table('d_user_login'.substr($self_end_time,0,6))
                                   ->select('uid')->where('type','=',0)
                                   ->whereBetween('time',[$self_start_time,$self_end_time])
                            );
                    $list_sql = $sql->tosql();
                    $list_val = $sql->getBindings();
                    $sql_res =self::getStringReplace($list_val,$list_sql) ;
                    $res[$key] = DB::connection('log')->table(DB::raw('('.$sql_res.') as tem'))->select(DB::raw('count(uid) as total'))->lists('total');
                }
                $res[$key]['total'] = $res[$key][0];
                unset($res[$key][0]);
                $res[$key]['day'] = $val;
            };
            $list = array_merge($res,$week_data);
            $list = FunctionController::arr_sort($list,'SORT_DESC','day');
            if(count($week_data_day)>0) Storage::delete($file_name);
            //修改寫入文件
            Storage::disk('local')->put($file_name,json_encode($list));
        }else{
            //讀取文件緩存
            //依據時間區間讀取
            $start_time = date('Ymd',strtotime($data['start_time']));
            $end_time  = date('Ymd',strtotime($data['end_time']));
            foreach($week_data as $key=>$val){
                if($val['day']==$start_time) $start = $key;
                if($val['day']==$end_time) $end = $key;
            }
            $list = array_slice($week_data,$end,$start-$end+1);
        }
        return view('chart/keep/weekKeepView')->with('week_keep_data',$list)->with('data',$data);
    }




 /**
     * Query_toSql ? 號替換值
     * @param $array query_getBindings 值
     * @param $string query_tosql
     * @return string
     */
    public function getStringReplace($array, $string){
        $result = '';
        $stringArray = explode("?", $string);
        foreach($stringArray as $k=>$v){
            if(isset($array[$k])){
                $result .= $v."'".$array[$k]."'";
            }else {
                $result .= $v;
            }
        }
        return $result;
    }




發佈了150 篇原創文章 · 獲贊 112 · 訪問量 72萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章