2017-08-23 81 views
0

我正在研究一個運動隊的應用程序,並試圖總計(總計)每個球員在整個賽季中得分的進球。我有一個查詢,如下所示:基於ID查詢多列的求和方法

$GMC = DB::table('matchcards')->where('grade_id', $gradeId)->select('id')->get(); 
     foreach($GMC as $object) 
     { 
      $arrays[] = (array) $object; 
     } 
     $GMCX = collect($arrays)->flatten(); 

    foreach ($GMCX as $mc) { //Loop 1 - Get a list of all matchcards for this grade 

     $im = DB::table('matchcards')->distinct()->select('capt', 'gk', 'player3', 'player4', 'player5', 'player6', 'player7', 'player8' 
      , 'player9', 'player10', 'player11', 'player12', 'player13', 'player14', 'player15', 'player16')->where('id', $mc)->get(); 

     foreach ($im as $object2) { 
      $arrays2[] = (array)$object2; 
     } 

     $imx = collect($arrays2)->flatten(); //Gets all the PlayedIDs from above loop 
    } //end of Loop 1 

     $gp ='0'; $gamesplayed= array(); $collection = collect(); $M='0'; 
     foreach ($imx as $p) { //loop 2 - take each id and count games played 
      $_GET['p'] = $p; 
      $pcount = DB::table('matchcards')->where('capt', $p)->where('grade_id', $gradeId)->orWhere('gk', $p)->orWhere('player3', $p) 
       ->orWhere('player4', $p)->orWhere('player5', $p)->orWhere('player6', $p)->orWhere('player7', $p) 
       ->orWhere('player8', $p)->orWhere('player9', $p)->orWhere('player10', $p)->orWhere('player11', $p) 
       ->orWhere('player12', $p)->orWhere('player13', $p)->orWhere('player14', $p)->orWhere('player15', $p) 
       ->orWhere('player16', $p)->get(); 
      $gp = count($pcount); 
      if (count($pcount) > 0){ //Get Players Full Name 
       $pn = DB::table('players')->select('id', 'fname', 'lname')->where('id', $p)->get(); 
       if (count($pn)>0) { 
        $pname = $pn[0]->fname." ".$pn[0]->lname; 
       } 

    $M = DB::table('matchcards') 
        ->select('p1scorer', 'p1goals','p2scorer', 'p2goals', 'p3scorer', 'p3goals','p4scorer', 'p4goals', 'p5scorer', 'p5goals','p6scorer', 'p6goals') 
        ->where('grade_id', '=', $gradeId) 
        ->Where(function ($query) { 
         $p = $_GET['p']; 
         $query->where('p1scorer', '=', $p) 
          ->orWhere('p2scorer', '=', $p) 
          ->orWhere('p3scorer', '=', $p) 
          ->orWhere('p4scorer', '=', $p) 
          ->orWhere('p5scorer', '=', $p) 
          ->orWhere('p6scorer', '=', $p); 
        }) 
        ->sum(DB::raw('p1goals + p2goals + p3goals + p4goals + p5goals + p6goals')); 
        //->select(DB::raw('sum(p1goals + p2goals + p3goals + p4goals + p5goals + p6goals) as goals_scored'))->get(); 

}

  //Add all objects into collection/ 
      $collection->push(['id' => $p, 'gp' => $gp, 'pname' => $pname, 'gs' => $M]); 

     } //end of loop 2 

     $unique = $collection->unique(); //Removed duplicate IDs 

它是隻返回誰拿下的人 - 所以它的一半工作。我只是不知道如何合併該用戶的目標(跨越6個可能的列)。目前,我的查詢將該特定比賽/遊戲(或數據庫中的行)的所有目標添加到玩家。

有6個可能的列,每個教練可以選擇6名球員進球(因此,p1scorer和p1goals屬於一起,p2scorer和p2goals屬於一起...每週的playerID可以在任何一個P1scorer到p6scorer列 - 但從不重複在同一行)。情景示例第1周(第1行)p1scorer是17(球員ID),他們打入2球(因此p1goals中有2個)。此外,p2scorer是5誰獲得了1個目標 - 所以總共3個目標 - 想發送到該行的數組(目標:17目標:2){id:5目標:1},並循環所有其他行和添加。目標爲誰拿下整個賽季每個人現有的理貨

希望有人也許能夠幫助我在這裏...在此先感謝...

回答

0

你應該試試這個:

使用使用輸入;

$p = $request->p; 

OR

$p = Input::get(p); 


$M = DB::table('matchcards') 
        ->select('p1scorer', 'p1goals','p2scorer', 'p2goals', 'p3scorer', 'p3goals','p4scorer', 'p4goals', 'p5scorer', 'p5goals','p6scorer', 'p6goals') 
        ->where('grade_id', '=', $gradeId) 
        ->Where(function ($query) use($p) { 

         $query->where('p1scorer', '=', $p) 
          ->orWhere('p2scorer', '=', $p) 
          ->orWhere('p3scorer', '=', $p) 
          ->orWhere('p4scorer', '=', $p) 
          ->orWhere('p5scorer', '=', $p) 
          ->orWhere('p6scorer', '=', $p); 
        }); 

        ->sum(DB::raw('p1goals + p2goals + p3goals + p4goals + p5goals + p6goals')); 

希望這對你的工作!

+0

感謝您的幫助/建議...當我在查詢之外移動GET命令時,子查詢中的$ p返回「未定義變量」,這就是爲什麼我在查詢中使用它。然而,這部分似乎工作正常(因爲我只獲得了陣列中的進球得分手 - 我的問題/挑戰是在整個大約20行的回報中,在六列中的一列中添加與$ p(ID)相關聯的目標這就是我卡在...歡呼 – Jimmy

+0

@Jimmy讓我檢查它 –

+0

@Jimmy請檢查我的$ p變量的更新答案 –