Как оптимизировать повторный запрос? - PullRequest
0 голосов
/ 20 декабря 2018

Я должен сделать запрос с датой ввода и датой окончания.Здесь у меня один и тот же код повторяется много раз в запросе.В приведенном ниже примере только первые db_A и db_b были получены только в тех случаях, когда условия, отличающиеся от начальных и конечных значений, были бы одинаковыми.

Для db_C у меня нет условия "where ('a.compid', '9')" идата начала / окончания отличается.

Кто-нибудь может мне помочь, как я могу оптимизировать этот код?

Это код, который я пробовал.

$start = date("Y-m-01", strtotime($inputdate));
$end = $inputdate;

$db_A = DB::table('standard as a')
            ->join(DB::raw("(select distinct salid, cuscod, compid from stdmap_cus) b"), function($join){
                $join->on('a.compid', '=', 'b.compid')->on('a.cuscod', '=', 'b.cuscod');
            })
            ->select('b.salid', DB::raw('sum(turnover) as sumturn'))
            ->where('a.compid', '99999999')
            ->whereBetween('date', [$start, $end])
            ->groupBy('b.salid')
            ->get()->toArray();

$res_A = $this->getSalTurn(json_decode(json_encode($db_A), true));

$db_B = DB::table('standard as a')
            ->join(DB::raw("(select distinct salid, cuscod, compid from stdmap_cus) b"), function($join){
            $join->on('a.compid', '=', 'b.compid')->on('a.cuscod', '=', 'b.cuscod');
            })
            ->select('b.salid', DB::raw('sum(turnover) as sumturn'))
            ->where('a.compid', '!=', '99999999')
            ->whereBetween('date', [$startMTD, $endMTD])
            ->groupBy('b.salid')
            ->get()->toArray();

$res_B = $this->getSalTurn(json_decode(json_encode($db_B), true));

$start = date("Y-m-01", strtotime("-1 year", strtotime($inputdate)));
$end = date("Y-m-t", strtotime("-1 year", strtotime($inputdate)));


$db_C = DB::table('standard as a')
            ->join(DB::raw("(select distinct salid, cuscod, compid from stdmap_cus) b"), function($join){
                $join->on('a.compid', '=', 'b.compid')->on('a.cuscod', '=', 'b.cuscod');
            })
            ->select('b.salid', DB::raw('sum(turnover) as sumturn'))
            ->whereBetween('date', [$startMLY, $endMLY])
            ->groupBy('b.salid')
            ->get()->toArray();
$res_C = $this->getSalTurn(json_decode(json_encode($db_C), true));

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете установить запрос по умолчанию, а затем клонировать его.

$start = '...';
$end = '...';

$startMTD = '...';
$endMTD = '...';

$startMLY = '...';
$endMLY = '...';

$defaultQuery = DB::table('standard as a')
      ->join(DB::raw("(select distinct salid, cuscod, compid from stdmap_cus) b"), function($join){
          $join->on('a.compid', '=', 'b.compid')->on('a.cuscod', '=', 'b.cuscod');
      })
      ->select('b.salid', DB::raw('sum(turnover) as sumturn'))
      ->groupBy('b.salid');

$db_A = (clone $defaultQuery)
      ->where('a.compid', '99999999')
      ->whereBetween('date', [$start, $end])
      ->get();

$db_B = (clone $defaultQuery)
      ->where('a.compid', '99999999')
      ->whereBetween('date', [$startMTD, $endMTD])
      ->get();

$db_C = (clone $defaultQuery)
      ->whereBetween('date', [$startMLY, $endMLY])
      ->get();

$res_A = $this->getSalTurn($db_A->toArray();
$res_B = $this->getSalTurn($db_B->toArray();
$res_C = $this->getSalTurn($db_C->toArray());

И я думаю, вам не нужно использовать json_decode(json_encode($db_A), true), он возвращает массив, который у вас уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...