订单后组

时间:2017-02-01 05:31:02

标签: cakephp group-by find

在cakephp 2中我想按降序对表进行分组 总是返回表的第一条记录 但我希望通过订购

返回最后一条记录

我的数据,代码和结果在这里:

表格中的数据: table data

控制器中的代码:

$books = $this->Book->find('all', array(
    'order' => array('age' => 'DESC'),
    'group' => 'name'
));
print_r($books);

以上代码后的结果:

Array
(
    [0] => Array
    (
        [Book] => Array
        (
            [id] => 1
            [name] => ramin
            [family] => zardoshti
            [age] => 32
            [city] => semnan
        )

    )

    [1] => Array
    (
        [Book] => Array
        (
            [id] => 2
            [name] => esmaeil
            [family] => seydi
            [age] => 30
            [city] => semnan
        )

    )

)

但我想要这个结果:

    Array
(
    [0] => Array
    (
        [Book] => Array
        (
            [id] => 1
            [name] => ramin
            [family] => zardoshti
            [age] => 42
            [city] => tehran
        )

    )

    [1] => Array
    (
        [Book] => Array
        (
            [id] => 2
            [name] => esmaeil
            [family] => seydi
            [age] => 30
            [city] => semnan
        )

    )

)

1 个答案:

答案 0 :(得分:0)

动态添加虚拟字段到您的Book模型

$this->Book->virtualFields = array(
    'max_age' => sprintf('max(%s.age)', $this->Book->alias)
);
$books = $this->Book->find('all', array(
    'order' => array('age' => 'DESC'),
    'group' => 'name'
));
print_r($books);

虚拟字段将有助于获取具有最大年龄值的行。

您的SQL查询将如下所示:

SELECT 
    `Book`.`id`, `Book`.`name`, `Book`.`family`, `Book`.`age`, 
    `Book`.`city`, (max(`Book`.`age`)) AS `Book__max_age` 
FROM 
    `test`.`books` AS `Book` 
WHERE 
    1 = 1 
GROUP BY 
    name 
ORDER BY 
    `age` DESC