2015-02-06 58 views
1

下面顯示的所有行是Banking MySQL表結構:的CakePHP的GroupBy以結構化格式

id | name | type 
1 | abc | xyz 
2 | jkl | xyz 
3 | efg | pql 

眼下記錄顯示在下面的格式:

Array 
    (
     [0] => Array 
      (
       [Banking] => Array 
        (
         [id] => 1 
         [name] => abc 
         [type] => xyz 
        ) 

      ) 

     [1] => Array 
      (
       [Banking] => Array 
        (
         [id] => 2 
         [name] => jkl 
         [type] => xyz 
        ) 

      ) 
     [2] => Array 
      (
       [Banking] => Array 
        (
         [id] => 3 
         [name] => efg 
         [type] => pql 
        ) 

      ) 
    ) 

我需要GROUPBY領域根據type字段並顯示所有記錄。以下是期望結構:

Array 
    (
     [xyz] => Array 
      (
       [0] => Array 
        (
         [id] => 1 
         [name] => abc 
        ) 
       [1] => Array 
        (
         [id] => 2 
         [name] => jkl 
        ) 

      ) 

     [pql] => Array 
      (
       [0] => Array 
        (
         [id] => 2 
         [name] => efg 
         [type] => xyz 
        ) 

      ) 

    ) 

我試圖分組它下面的方式,但沒有奏效,因爲顯示的GroupBy每type只有一個記錄。

$bankList = $this -> Banking -> find('all', array(
      'order' => 'Banking.name asc', 
      'fields' => array(
       'Banking.id', 
       'Banking.name', 
       'Banking.type' 
      ), 
      'group' => array('Banking.type') 
     )); 

雖然我取得的成果定製$bankList

foreach ($bankList as $b) { 
      if (!in_array($b['Banking']['type'], $type)) { 
       $type[] = $b['Banking']['type']; 
      } 

      $bList[$b['Banking']['type']][] = array(
       'name' => $b['Banking']['name'], 
       'id' => $b['Banking']['id'] 
      ); 
     } 

,但如果可能的只有一個查詢疑惑?

+0

您應該使用訂單 – 2015-02-06 11:57:27

回答

0

我試過按以下方式對它進行分組,因爲GroupBy 只顯示每種類型的一條記錄。

你可能想先學習SQL,因爲這是GROUP BY預期的行爲,見What does group by do exactly ?

你所得到的陣列結構是標準的CakePHP的結構,並且具有什麼都做SQL本身。 CakePHP是如何格式化它們的。請使用Model::afterFind()回調來修改結果。創建一個新方法,如transformResult(),並在afterFind()中通過它傳遞數據。

+0

感謝您的回答。這就是我提到的,GroupBy總結了記錄,並想知道是否可以更改GroupBy的默認行爲,以嵌套格式顯示所有字段。或者使用SQL查詢來實現結果的任何其他最佳方式,以便我不必使用自定義方法重新構造它。 – 2015-02-07 04:08:36

0

通過在從數據庫中獲取數據後操作數據,可以實現所需的結構。在CakePHP可以使用groupBy方法:

$bankList = $this -> Banking -> find('all', array(
     'order' => 'Banking.name asc', 
     'fields' => array(
      'Banking.id', 
      'Banking.name', 
      'Banking.type' 
     ) 
    )) -> groupBy('type'); 

請注意,它有沒有關係SQL查詢!這只是一個方便的方式來做你的代碼相同的數據重組。