CakePHP GroupBy以结构化格式显示所有行

时间:2015-02-06 11:40:25

标签: php mysql cakephp

以下是Banking MySQL表结构:

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
                    )

            )
    )

我需要根据type字段显示GroupBy字段并显示所有记录。以下是理想的结构:

    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']
            );
        }

但是想知道它是否可以仅使用查询?

2 个答案:

答案 0 :(得分:0)

  

我尝试按以下方式对其进行分组,但自GroupBy以来无效   每种类型只显示一条记录。

您可能希望首先学习SQL,因为这是GROUP BY的预期行为,请参阅What does group by do exactly ?

您得到的结果数组结构是标准的CakePHP结构,并且 根本没有与SQL本身有关。这就是CakePHP如何格式化它们。

使用Model::afterFind()回调根据需要修改结果。创建一个新方法,如transformResult(),并在afterFind()中传递数据。

答案 1 :(得分:0)

通过在从数据库中获取数据后操作数据,可以实现所需的结构。在CakePHP中,您可以使用groupBy方法:

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

请注意,它与SQL查询无关!这是与代码进行相同数据重组的便捷方式。