2016-11-01 1 views
0

Я закодировал некоторое время с помощью cakephp2. Я использую таблицу с расчетными значениями в год и месяц. , например.Миграция cakephp 2.x to 3.x сгруппированный результат по запросу

YEAR | MONTH | VALUENAME | VALUE 
2011 | 1  | value1 | 100 
2011 | 2  | value1 | 120 
2011 | 1  | value2 | 1234 
2011 | 2  | value2 | 4342 
etc. 

Теперь я хочу иметь годовые значения суммы за «имя_цены». В Cake2 я использовал следующее выражение, чтобы получить результат, где я год как массив ключ (что важно для моей точки зрения):

$yearvalues = $this->Aggregation->find('list', [ 
"fields" => ['Aggregation.value_name', 'Aggregation.sum_value', 'Aggregation.y'], 
"group" => ['Aggregation.y', 'Aggregation.value_name'] 
]); 

В моей модели «агрегация» я получил следующее:

public $virtualFields = array(
     'sum_value' => "sum(value)", 
    ); 

результат выглядит следующим образом:

Array 
(
    [2011] => Array 
     (
      [value1] => 1429.00 
      [value2] => 1180.00 
      [value3] => 0.00 
      [value4] => 804.00 
     ) 

    [2012] => Array 
     (
      [value1] => 1878.00 
      [value2] => 2793.00 
      [value3] => 3900.00 
      [value4] => 1606.00 
     ) 
    ... 
) 

Как я могу получить тот же результат, сейчас в Cake3. Я немного запутался о том, как относиться к Query-Object в правильном направлении :-( Вот что я до сих пор:

$yearvalues->select(['Aggregation.value_name', 
'sum_value' => $yearvalues->func()->sum('Aggregation.value'), 'y']) 
->group(['Aggregation.y', 'Aggregation.value_name']); 

Может кто-то помочь мне с правильным подходом

ТНХ Оливер

ответ

0

Вы можете использовать list искатель для этого в CakePHP 3.x тоже поддерживает подобные варианты.

$yearvalues 
    ->find('list', [ 
     'keyField' => 'value_name', 
     'valueField' => 'sum_value', 
     'groupField' => 'y' 
    ]) 
    ->select([ 
     'Aggregation.value_name', 
     'sum_value' => $yearvalues->func()->sum('Aggregation.value'), 
     'Aggregation.y' 
    ]) 
    ->group([ 
     'Aggregation.y', 
     'Aggregation.value_name' 
    ]); 

Finder в основном просто добавляет форматировщик результатов, который будет использовать Collection::combine() для форматирования полученных результатов, а также почему вы не используете псевдонимы для параметров поля, в результатах будут только объекты/массивы со свойствами/именами полей полей !

Смотрите также