【问题标题】:CakePHP GroupBy displaying all rows in a structured formatCakePHP GroupBy 以结构化格式显示所有行
【发布时间】:2015-02-06 11:40:25
【问题描述】:

下面是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字段分组字段并显示所有记录。以下是所需的结构:

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

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

【问题讨论】:

  • 你应该使用 order by

标签: php mysql cakephp


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答。这就是我提到的,GroupBy 对记录进行总结,并想知道是否可以更改 GroupBy 的默认行为以以嵌套格式显示所有字段。或使用 SQL 查询获得结果的任何其他最佳方式,这样我就不必使用自定义方法再次对其进行重构。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多