2017-02-01 1 views
0

В 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 
     ) 

    ) 

) 

ответ

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