簡體   English   中英

如何按兩列對查詢進行計數和分組?

[英]How to count and group a query by two columns?

我有一個雄辯的查詢返回的集合。 集合中的每個元素都是只有兩個整數元素(branch_id,event_id)的數組。 我需要進行make和array或collection,其中所有相同的元素對都組合在同一個數組中,因為我需要計算一對元素出現的次數,並且還能夠訪問其值。

我正在使用查詢生成器的groupBy方法將結果按兩列分組,但它只返回由傳遞給該方法的第一列名稱組合的數據。

例如:

    array:15 [▼
  0 => {#277 ▼
    +"branch_id": 1
    +"event_id": 1
  }
  1 => {#279 ▼
    +"branch_id": 1
    +"event_id": 1
  }
  2 => {#280 ▼
    +"branch_id": 1
    +"event_id": 1
  }
  3 => {#281 ▼
    +"branch_id": 1
    +"event_id": 1
  }
  4 => {#282 ▼
    +"branch_id": 1
    +"event_id": 2
  }
  5 => {#283 ▼
    +"branch_id": 1
    +"event_id": 21
  }
  6 => {#292 ▼
    +"branch_id": 58
    +"event_id": 21
  }
  7 => {#284 ▼
    +"branch_id": 2
    +"event_id": 5
  }
  8 => {#285 ▼
    +"branch_id": 3
    +"event_id": 3
  }
  9 => {#286 ▼
    +"branch_id": 4
    +"event_id": 4
  }
  10 => {#287 ▼
    +"branch_id": 5
    +"event_id": 9
  }
  11 => {#289 ▼
    +"branch_id": 5
    +"event_id": 9
  }
  12 => {#288 ▼
    +"branch_id": 5
    +"event_id": 8
  }
  13 => {#290 ▼
    +"branch_id": 7
    +"event_id": 10

如您所見,前四個數組具有相同的值(branch_id:1,event_id:id),我需要檢索合並在單個數組中的那些值,以此類推,對於具有相同值的每個數組,依此類推。

我能夠這樣

    public function getAllIncidents()
{
    $i = 0;
    $data = [];
    $values = DB::table('incidents')->select('branch_id', 'event_id')->orderBy('branch_id')->get()->groupBy('event_id');

    foreach ($values as $key => $value) {
        $collections[$i] = $value->groupBy('branch_id');
        $i++;
    }

    $collections = array_collapse($collections);
    $i = 0;

    foreach ($collections as $key => $collection) {
        $array                  = $collection->toArray();
        $data[$i]['count']      = sizeof($array);
        $data[$i]['branch_id']  = $array[0]->branch_id;
        $data[$i]['event_id']   = $array[0]->event_id;
        $i++;            
    }

    return response()->json($data, 200);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM